@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/index.css ADDED
@@ -0,0 +1,3662 @@
1
+ /**
2
+ * Tabs 组件样式
3
+ *
4
+ * 命名规范: .taskon-tabs-[element]--[modifier]
5
+ * 基于 Figma UserCenter 设计规范
6
+ */
7
+
8
+ /* ========== 容器 ========== */
9
+ .taskon-tabs {
10
+ position: relative;
11
+ display: inline-flex;
12
+ flex-direction: column;
13
+ gap: 0;
14
+ }
15
+
16
+ /* ========== Tab 列表 ========== */
17
+ .taskon-tabs__list {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: var(--taskon-tabs-gap, 40px);
21
+ }
22
+
23
+ /* ========== Tab 项 ========== */
24
+ .taskon-tabs__tab {
25
+ position: relative;
26
+ padding: 0;
27
+ padding-bottom: 9px;
28
+ background: transparent;
29
+ border: none;
30
+ cursor: pointer;
31
+ transition: color 0.2s ease;
32
+
33
+ /* Typography: 16px Medium */
34
+ font-size: 16px;
35
+ font-weight: 500;
36
+ line-height: 24px;
37
+ white-space: nowrap;
38
+
39
+ /* 默认颜色: text-light (60% 白色) */
40
+ color: var(--taskon-color-text-secondary, rgba(255, 255, 255, 0.6));
41
+ }
42
+
43
+ .taskon-tabs__tab:hover:not(.taskon-tabs__tab--disabled) {
44
+ color: var(--taskon-color-text-light-hover, rgba(255, 255, 255, 0.8));
45
+ }
46
+
47
+ /* 激活状态: 更粗字体 + 白色 */
48
+ .taskon-tabs__tab--active {
49
+ font-weight: 600;
50
+ color: var(--taskon-color-text, white);
51
+ }
52
+
53
+ /* 禁用状态 */
54
+ .taskon-tabs__tab--disabled {
55
+ color: var(--taskon-color-text-disabled, rgba(255, 255, 255, 0.3));
56
+ cursor: not-allowed;
57
+ }
58
+
59
+ /* ========== 下划线指示器 ========== */
60
+ .taskon-tabs__indicator {
61
+ position: absolute;
62
+ bottom: 0;
63
+ left: 0;
64
+ height: 2px;
65
+ /* 渐变色:蓝色 -> 绿色(基于 Figma 设计 Brand/primary -> Brand/secondary) */
66
+ background: linear-gradient(90deg, #2771ff 0%, #1fcbaf 100%);
67
+ border-radius: 1px;
68
+ transition: transform 0.25s ease, width 0.25s ease;
69
+ }
70
+ /**
71
+ * Select 组件样式
72
+ *
73
+ * 基于 Vue ProSelect 组件样式翻译
74
+ * 使用 taskon-select 命名空间避免样式冲突
75
+ */
76
+
77
+ /* ========== 根容器 ========== */
78
+ .taskon-select {
79
+ --select-height: 44px;
80
+ --select-min-width: 120px;
81
+ --select-padding: 0 12px;
82
+ --select-background: rgba(255, 255, 255, 0.05);
83
+ --select-hover-background: rgba(255, 255, 255, 0.08);
84
+ --select-focus-background: rgba(255, 255, 255, 0.08);
85
+ --select-color: #fff;
86
+ --select-placeholder-color: rgba(255, 255, 255, 0.5);
87
+ --select-border: 1px solid rgba(255, 255, 255, 0.1);
88
+ --select-hover-border: 1px solid rgba(255, 255, 255, 0.2);
89
+ --select-focus-border: 1px solid rgba(255, 255, 255, 0.3);
90
+ --select-border-radius: 8px;
91
+ --select-font-size: 14px;
92
+ --select-line-height: 20px;
93
+ --select-z-index: 9999;
94
+ --select-menu-background: #343a3d;
95
+ --select-menu-border: 1px solid rgba(255, 255, 255, 0.1);
96
+ --select-menu-border-radius: 8px;
97
+ --select-option-padding: 15px 20px;
98
+ --select-option-hover-background: #424a4d;
99
+ --select-option-color: #fff;
100
+ --select-option-desc-color: rgba(255, 255, 255, 0.6);
101
+
102
+ position: relative;
103
+ display: inline-block;
104
+ width: 100%;
105
+ }
106
+
107
+ /* ========== 禁用状态 ========== */
108
+ .taskon-select--disabled {
109
+ opacity: 0.6;
110
+ cursor: not-allowed;
111
+ }
112
+
113
+ /* ========== 触发器 ========== */
114
+ .taskon-select__trigger {
115
+ display: flex;
116
+ align-items: center;
117
+ height: var(--select-height);
118
+ min-width: var(--select-min-width);
119
+ padding: var(--select-padding);
120
+ background: var(--select-background);
121
+ color: var(--select-color);
122
+ font-size: var(--select-font-size);
123
+ line-height: var(--select-line-height);
124
+ border: var(--select-border);
125
+ border-radius: var(--select-border-radius);
126
+ cursor: pointer;
127
+ transition:
128
+ background 0.2s,
129
+ border-color 0.2s;
130
+ outline: none;
131
+ user-select: none;
132
+ }
133
+
134
+ .taskon-select__trigger:hover:not(.taskon-select__trigger--disabled) {
135
+ background: var(--select-hover-background);
136
+ border: var(--select-hover-border);
137
+ }
138
+
139
+ .taskon-select__trigger:focus:not(.taskon-select__trigger--disabled) {
140
+ background: var(--select-focus-background);
141
+ border: var(--select-focus-border);
142
+ }
143
+
144
+ .taskon-select__trigger--open {
145
+ background: var(--select-focus-background);
146
+ border: var(--select-focus-border);
147
+ }
148
+
149
+ .taskon-select__trigger--disabled {
150
+ cursor: not-allowed;
151
+ opacity: 0.6;
152
+ }
153
+
154
+ .taskon-select__trigger--error {
155
+ border-color: #f55 !important;
156
+ }
157
+
158
+ /* 深色主题 */
159
+ .taskon-select__trigger--dark {
160
+ --select-background: #2a2f32;
161
+ --select-hover-background: #343a3d;
162
+ --select-focus-background: #343a3d;
163
+ }
164
+
165
+ /* 浅色主题 */
166
+ .taskon-select__trigger--light {
167
+ --select-background: #fff;
168
+ --select-hover-background: #f5f5f5;
169
+ --select-focus-background: #f0f0f0;
170
+ --select-color: #333;
171
+ --select-placeholder-color: #999;
172
+ --select-border: 1px solid #e5e5e5;
173
+ --select-hover-border: 1px solid #ccc;
174
+ --select-focus-border: 1px solid #999;
175
+ }
176
+
177
+ /* 卡片主题 */
178
+ .taskon-select__trigger--card {
179
+ --select-background: transparent;
180
+ --select-hover-background: rgba(255, 255, 255, 0.05);
181
+ --select-border: none;
182
+ --select-hover-border: none;
183
+ --select-focus-border: none;
184
+ }
185
+
186
+ /* ========== 触发器图标 ========== */
187
+ .taskon-select__trigger-icon {
188
+ width: 20px;
189
+ height: 20px;
190
+ border-radius: 50%;
191
+ margin-right: 10px;
192
+ flex-shrink: 0;
193
+ }
194
+
195
+ /* ========== 触发器文本 ========== */
196
+ .taskon-select__trigger-text {
197
+ flex: 1;
198
+ overflow: hidden;
199
+ text-overflow: ellipsis;
200
+ white-space: nowrap;
201
+ text-align: left;
202
+ }
203
+
204
+ /* ========== 触发器占位符 ========== */
205
+ .taskon-select__trigger-placeholder {
206
+ flex: 1;
207
+ color: var(--select-placeholder-color);
208
+ text-align: left;
209
+ }
210
+
211
+ /* ========== 展开图标 ========== */
212
+ .taskon-select__unfold-icon {
213
+ margin-left: 10px;
214
+ color: var(--select-color);
215
+ opacity: 0.6;
216
+ transition: transform 0.2s;
217
+ flex-shrink: 0;
218
+ }
219
+
220
+ .taskon-select__unfold-icon--rotated {
221
+ transform: rotate(180deg);
222
+ }
223
+
224
+ /* ========== 下拉菜单 ========== */
225
+ .taskon-select__menu {
226
+ /* Portal 模式下需要独立定义变量,因为不在 .taskon-select 内部 */
227
+ --select-menu-background: #343a3d;
228
+ --select-menu-border: 1px solid rgba(255, 255, 255, 0.1);
229
+ --select-menu-border-radius: 8px;
230
+ --select-option-padding: 15px 20px;
231
+ --select-option-hover-background: #424a4d;
232
+ --select-option-color: #fff;
233
+ --select-option-desc-color: rgba(255, 255, 255, 0.6);
234
+
235
+ position: absolute;
236
+ top: 100%;
237
+ left: 0;
238
+ right: 0;
239
+ margin-top: 4px;
240
+ background: var(--select-menu-background);
241
+ border: var(--select-menu-border);
242
+ border-radius: var(--select-menu-border-radius);
243
+ overflow: auto;
244
+ z-index: 9999;
245
+ }
246
+
247
+ /* 深色主题 */
248
+ .taskon-select__menu--dark {
249
+ --select-menu-background: #2a2f32;
250
+ --select-option-hover-background: #3a4144;
251
+ }
252
+
253
+ /* 浅色主题 */
254
+ .taskon-select__menu--light {
255
+ --select-menu-background: #fff;
256
+ --select-menu-border: 1px solid #e5e5e5;
257
+ --select-option-color: #333;
258
+ --select-option-hover-background: #f5f5f5;
259
+ --select-option-desc-color: #999;
260
+ }
261
+
262
+ /* ========== 选项 ========== */
263
+ .taskon-select__option {
264
+ display: flex;
265
+ align-items: center;
266
+ padding: var(--select-option-padding);
267
+ color: var(--select-option-color);
268
+ cursor: pointer;
269
+ transition: background 0.15s;
270
+ }
271
+
272
+ .taskon-select__option:hover:not(.taskon-select__option--disabled) {
273
+ background: var(--select-option-hover-background);
274
+ }
275
+
276
+ .taskon-select__option--active {
277
+ background: rgba(255, 255, 255, 0.05);
278
+ }
279
+
280
+ .taskon-select__option--disabled {
281
+ cursor: not-allowed;
282
+ opacity: 0.4;
283
+ }
284
+
285
+ .taskon-select__option--danger .taskon-select__option-label {
286
+ color: #f55;
287
+ }
288
+
289
+ /* ========== 选项图标 ========== */
290
+ .taskon-select__option-icon {
291
+ width: 20px;
292
+ height: 20px;
293
+ border-radius: 50%;
294
+ margin-right: 10px;
295
+ flex-shrink: 0;
296
+ }
297
+
298
+ /* ========== 选项内容 ========== */
299
+ .taskon-select__option-content {
300
+ flex: 1;
301
+ min-width: 0;
302
+ }
303
+
304
+ /* ========== 选项标签 ========== */
305
+ .taskon-select__option-label {
306
+ font-weight: 500;
307
+ font-size: 14px;
308
+ line-height: 20px;
309
+ overflow: hidden;
310
+ white-space: nowrap;
311
+ text-overflow: ellipsis;
312
+ }
313
+
314
+ /* ========== 选项描述 ========== */
315
+ .taskon-select__option-desc {
316
+ font-size: 12px;
317
+ line-height: 16px;
318
+ color: var(--select-option-desc-color);
319
+ margin-top: 2px;
320
+ }
321
+
322
+ /* ========== 选中勾选图标 ========== */
323
+ .taskon-select__option-check {
324
+ margin-left: 8px;
325
+ color: #4caf50;
326
+ flex-shrink: 0;
327
+ }
328
+
329
+ /* ========== 空状态 ========== */
330
+ .taskon-select__empty {
331
+ padding: 20px;
332
+ text-align: center;
333
+ color: rgba(255, 255, 255, 0.5);
334
+ font-size: 14px;
335
+ }
336
+
337
+ /* ========== 错误信息 ========== */
338
+ .taskon-select__error {
339
+ margin-top: 4px;
340
+ font-size: 12px;
341
+ color: #f55;
342
+ }
343
+
344
+ /* ========== 响应式 ========== */
345
+ @media (max-width: 750px) {
346
+ .taskon-select {
347
+ --select-height: 40px;
348
+ --select-font-size: 13px;
349
+ --select-option-padding: 12px 16px;
350
+ }
351
+
352
+ .taskon-select__trigger-icon {
353
+ width: 16px;
354
+ height: 16px;
355
+ margin-right: 8px;
356
+ }
357
+
358
+ .taskon-select__option-icon {
359
+ width: 16px;
360
+ height: 16px;
361
+ margin-right: 8px;
362
+ }
363
+
364
+ .taskon-select__unfold-icon {
365
+ margin-left: 8px;
366
+ }
367
+ }
368
+ /**
369
+ * WithdrawSelectOption 组件样式
370
+ *
371
+ * 基于 Vue WithdrawSelectOption 组件样式翻译
372
+ */
373
+
374
+ .taskon-withdraw-option {
375
+ /* 独立定义变量,确保 Portal 模式下正常工作 */
376
+ --option-hover-bg: #424a4d;
377
+ --option-color: #fff;
378
+
379
+ padding: 15px 6px 15px 20px;
380
+ cursor: pointer;
381
+ }
382
+
383
+ .taskon-withdraw-option:hover {
384
+ background: var(--option-hover-bg, #424a4d);
385
+ }
386
+
387
+ /* 禁用状态 */
388
+ .taskon-withdraw-option--disabled {
389
+ cursor: not-allowed;
390
+ opacity: 0.4;
391
+ }
392
+
393
+ /* ========== 主要内容 ========== */
394
+ .taskon-withdraw-option__content {
395
+ display: flex;
396
+ align-items: center;
397
+ }
398
+
399
+ /* 模糊状态(不可提现) */
400
+ .taskon-withdraw-option__content--blurred {
401
+ pointer-events: none;
402
+ opacity: 0.4;
403
+ }
404
+
405
+ /* ========== 链信息 ========== */
406
+ .taskon-withdraw-option__chain {
407
+ display: inline-flex;
408
+ align-items: center;
409
+ gap: 8px;
410
+ width: 33.33%;
411
+ min-width: 0;
412
+ }
413
+
414
+ .taskon-withdraw-option__chain-icon {
415
+ width: 16px;
416
+ height: 16px;
417
+ border-radius: 50%;
418
+ flex-shrink: 0;
419
+ }
420
+
421
+ .taskon-withdraw-option__chain-label {
422
+ font-size: 14px;
423
+ color: rgba(255, 255, 255, 0.8);
424
+ overflow: hidden;
425
+ text-overflow: ellipsis;
426
+ white-space: nowrap;
427
+ }
428
+
429
+ /* ========== Token 信息 ========== */
430
+ .taskon-withdraw-option__token {
431
+ display: flex;
432
+ align-items: center;
433
+ flex: 1;
434
+ min-width: 0;
435
+ }
436
+
437
+ .taskon-withdraw-option__token-icon {
438
+ width: 16px;
439
+ height: 16px;
440
+ border-radius: 50%;
441
+ margin-right: 6px;
442
+ flex-shrink: 0;
443
+ }
444
+
445
+ .taskon-withdraw-option__token-label {
446
+ font-weight: 500;
447
+ font-size: 14px;
448
+ line-height: 20px;
449
+ color: var(--option-color, #fff);
450
+ overflow: hidden;
451
+ white-space: nowrap;
452
+ text-overflow: ellipsis;
453
+ }
454
+
455
+ /* ========== 尾部信息(余额 + 选中状态) ========== */
456
+ .taskon-withdraw-option__trailing {
457
+ display: flex;
458
+ align-items: center;
459
+ justify-content: flex-end;
460
+ gap: 4px;
461
+ flex-shrink: 0;
462
+ }
463
+
464
+ .taskon-withdraw-option__balance {
465
+ font-size: 14px;
466
+ color: rgba(255, 255, 255, 0.5);
467
+ }
468
+
469
+ .taskon-withdraw-option__check {
470
+ width: 12px;
471
+ height: 8px;
472
+ color: #4caf50;
473
+ visibility: hidden;
474
+ }
475
+
476
+ .taskon-withdraw-option__check--visible {
477
+ visibility: visible;
478
+ }
479
+
480
+ /* ========== 警告提示 ========== */
481
+ .taskon-withdraw-option__warning {
482
+ margin-top: 4px;
483
+ font-size: 12px;
484
+ font-weight: 400;
485
+ color: var(--text-info-warning-60, #ffc107);
486
+ }
487
+
488
+ /* ========== 响应式 ========== */
489
+ @media (max-width: 750px) {
490
+ .taskon-withdraw-option {
491
+ padding: 12px 4px 12px 16px;
492
+ }
493
+
494
+ .taskon-withdraw-option__chain-icon,
495
+ .taskon-withdraw-option__token-icon {
496
+ width: 14px;
497
+ height: 14px;
498
+ }
499
+
500
+ .taskon-withdraw-option__chain-label,
501
+ .taskon-withdraw-option__token-label,
502
+ .taskon-withdraw-option__balance {
503
+ font-size: 13px;
504
+ }
505
+
506
+ .taskon-withdraw-option__warning {
507
+ font-size: 11px;
508
+ }
509
+ }
510
+ /**
511
+ * FormItem 组件样式
512
+ *
513
+ * 基于 Vue FormItem.vue 样式翻译
514
+ */
515
+
516
+ /* ========== 根容器 ========== */
517
+ .taskon-form-item {
518
+ --form-item-space: 16px;
519
+ --form-item-label-space: 8px;
520
+ --form-item-font-size: 14px;
521
+ --form-item-line-height: 20px;
522
+
523
+ position: relative;
524
+ }
525
+
526
+ /* 相邻 FormItem 之间的间距 */
527
+ .taskon-form-item + .taskon-form-item {
528
+ margin-top: var(--form-item-space);
529
+ }
530
+
531
+ /* Dialog 模式下的间距 */
532
+ .taskon-form-item--dialog + .taskon-form-item--dialog {
533
+ margin-top: 20px;
534
+ }
535
+
536
+ /* ========== 标签行 ========== */
537
+ .taskon-form-item__row {
538
+ display: flex;
539
+ align-items: center;
540
+ }
541
+
542
+ /* 有标签时的下边距 */
543
+ .taskon-form-item__row--has-label {
544
+ margin-bottom: var(--form-item-label-space);
545
+ }
546
+
547
+ /* 无下边距 */
548
+ .taskon-form-item__row--no-margin {
549
+ margin-bottom: 0;
550
+ }
551
+
552
+ /* ========== 标签 ========== */
553
+ .taskon-form-item__label {
554
+ display: flex;
555
+ align-items: center;
556
+ font-weight: 500;
557
+ font-size: var(--form-item-font-size);
558
+ line-height: var(--form-item-line-height);
559
+ color: #fff;
560
+ white-space: nowrap;
561
+ }
562
+
563
+ /* ========== 可选标记 ========== */
564
+ .taskon-form-item__optional {
565
+ color: rgba(255, 255, 255, 0.4);
566
+ }
567
+
568
+ /* ========== 提示图标 ========== */
569
+ .taskon-form-item__tip {
570
+ margin-left: 6px;
571
+ display: inline-flex;
572
+ align-items: center;
573
+ }
574
+
575
+ /* ========== 文档链接 ========== */
576
+ .taskon-form-item__doc-link {
577
+ margin-left: auto;
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 4px;
581
+ font-size: 14px;
582
+ color: var(--color-link, #7dd3fc);
583
+ text-decoration: none;
584
+ cursor: pointer;
585
+ }
586
+
587
+ .taskon-form-item__doc-link:hover {
588
+ text-decoration: underline;
589
+ }
590
+
591
+ .taskon-form-item__doc-icon {
592
+ width: 8px;
593
+ height: 9px;
594
+ }
595
+
596
+ /* ========== 错误信息 ========== */
597
+ .taskon-form-item__error {
598
+ margin-top: 4px;
599
+ font-size: 12px;
600
+ line-height: 16px;
601
+ color: #f55;
602
+ white-space: pre-wrap;
603
+ }
604
+
605
+ /* 警告样式(橙色) */
606
+ .taskon-form-item__error--warn {
607
+ color: #ffc107;
608
+ }
609
+
610
+ /* ========== 响应式 ========== */
611
+ @media (max-width: 750px) {
612
+ .taskon-form-item {
613
+ --form-item-space: 12px;
614
+ --form-item-label-space: 6px;
615
+ --form-item-font-size: 13px;
616
+ }
617
+
618
+ .taskon-form-item--dialog + .taskon-form-item--dialog {
619
+ margin-top: 4vw;
620
+ }
621
+
622
+ .taskon-form-item__tip {
623
+ margin-left: 2vw;
624
+ }
625
+ }
626
+ /**
627
+ * Checkbox 复选框组件样式
628
+ *
629
+ * 采用 BEM 命名规范
630
+ * 前缀: taskon-checkbox
631
+ *
632
+ * 参考 Vue 版本 BaseCheckBox.vue 样式实现
633
+ */
634
+
635
+ /* ============================================================================
636
+ 根元素
637
+ ============================================================================ */
638
+
639
+ .taskon-checkbox {
640
+ display: inline-flex;
641
+ align-items: center;
642
+ justify-content: center;
643
+ cursor: pointer;
644
+ user-select: none;
645
+ outline: none;
646
+ }
647
+
648
+ /* 悬停和聚焦效果 */
649
+ .taskon-checkbox:not(.taskon-checkbox--disabled):hover,
650
+ .taskon-checkbox:not(.taskon-checkbox--disabled):focus {
651
+ opacity: 0.8;
652
+ }
653
+
654
+ /* 禁用状态 */
655
+ .taskon-checkbox--disabled {
656
+ cursor: not-allowed;
657
+ opacity: 0.4;
658
+ }
659
+
660
+ /* 只读状态 */
661
+ .taskon-checkbox--readonly {
662
+ cursor: default;
663
+ opacity: 0.4;
664
+ }
665
+
666
+ /* ============================================================================
667
+ 隐藏的原生 input
668
+ ============================================================================ */
669
+
670
+ .taskon-checkbox__input {
671
+ display: none;
672
+ }
673
+
674
+ /* ============================================================================
675
+ 自定义图标容器
676
+ ============================================================================ */
677
+
678
+ .taskon-checkbox__icon {
679
+ display: flex;
680
+ justify-content: center;
681
+ align-items: center;
682
+ width: 20px;
683
+ height: 20px;
684
+ border: 2px solid var(--taskon-color-border, rgba(255, 255, 255, 0.2));
685
+ border-radius: 4px;
686
+ transition: all 0.2s ease;
687
+ flex-shrink: 0;
688
+ }
689
+
690
+ /* 选中状态 - 默认绿色背景 */
691
+ .taskon-checkbox__icon--active {
692
+ border: 0 none;
693
+ background-color: var(--taskon-color-secondary, #22c55e);
694
+ border-radius: 4px;
695
+ }
696
+
697
+ /* 选中状态显示勾选图标 */
698
+ .taskon-checkbox__icon--active .taskon-checkbox__icon-checked {
699
+ display: block;
700
+ }
701
+
702
+ /* light 类型选中状态 - 浅色背景 */
703
+ .taskon-checkbox__icon--active.taskon-checkbox__icon--light {
704
+ background-color: var(--taskon-color-lightest, #f0f0f0);
705
+ }
706
+
707
+ /* 圆形样式 */
708
+ .taskon-checkbox__icon--round {
709
+ border-radius: 50%;
710
+ }
711
+
712
+ /* ============================================================================
713
+ 勾选图标 SVG
714
+ ============================================================================ */
715
+
716
+ .taskon-checkbox__icon-checked {
717
+ display: none;
718
+ width: 12px;
719
+ height: 10px;
720
+ color: var(--taskon-color-text-white, #ffffff);
721
+ }
722
+
723
+ /* ============================================================================
724
+ 标签文字
725
+ ============================================================================ */
726
+
727
+ .taskon-checkbox__label {
728
+ margin-left: 8px;
729
+ color: var(--taskon-color-text-light, rgba(255, 255, 255, 0.8));
730
+ font-size: 16px;
731
+ font-style: normal;
732
+ font-weight: 500;
733
+ line-height: 20px;
734
+ }
735
+
736
+ /* ============================================================================
737
+ 响应式 - 移动端适配
738
+ ============================================================================ */
739
+
740
+ @media (max-width: 750px) {
741
+ .taskon-checkbox__icon {
742
+ width: 16px;
743
+ height: 16px;
744
+ border-radius: 3px;
745
+ }
746
+
747
+ .taskon-checkbox__icon-checked {
748
+ width: 10px;
749
+ height: 8px;
750
+ }
751
+
752
+ .taskon-checkbox__label {
753
+ font-size: 14px;
754
+ line-height: 18px;
755
+ }
756
+ }
757
+ /**
758
+ * Switch 开关组件样式
759
+ *
760
+ * 采用 BEM 命名规范
761
+ * 前缀: taskon-switch
762
+ *
763
+ * 参考 Vue 版本 BaseSwitch.vue 样式实现
764
+ */
765
+
766
+ /* ============================================================================
767
+ 根元素
768
+ ============================================================================ */
769
+
770
+ .taskon-switch {
771
+ position: relative;
772
+ display: inline-flex;
773
+ align-items: center;
774
+ vertical-align: middle;
775
+ font-size: 16px;
776
+ line-height: 23px;
777
+ color: var(--taskon-color-text-light, rgba(255, 255, 255, 0.8));
778
+ cursor: pointer;
779
+ user-select: none;
780
+ }
781
+
782
+ /* 禁用状态 */
783
+ .taskon-switch--disabled {
784
+ cursor: not-allowed;
785
+ opacity: 0.5;
786
+ }
787
+
788
+ /* ============================================================================
789
+ 标签文字
790
+ ============================================================================ */
791
+
792
+ .taskon-switch__label {
793
+ cursor: pointer;
794
+ }
795
+
796
+ .taskon-switch__label--disabled {
797
+ cursor: not-allowed;
798
+ }
799
+
800
+ /* ============================================================================
801
+ 开关按钮
802
+ ============================================================================ */
803
+
804
+ .taskon-switch__button {
805
+ position: relative;
806
+ width: 38px;
807
+ height: 20px;
808
+ line-height: 20px;
809
+ background: #464646;
810
+ border: 1px solid rgba(255, 255, 255, 0.1);
811
+ border-radius: 100px;
812
+ padding: 2px 3px;
813
+ margin-left: 15px;
814
+ transition: all 0.3s ease;
815
+ flex-shrink: 0;
816
+ }
817
+
818
+ /* 开启状态 - 默认渐变背景 */
819
+ .taskon-switch__button--active {
820
+ background: linear-gradient(89.87deg, #cbff01 0.13%, #00ffa3 99.92%);
821
+ border-color: transparent;
822
+ }
823
+
824
+ /* 禁用状态 */
825
+ .taskon-switch__button--disabled {
826
+ cursor: not-allowed;
827
+ }
828
+
829
+ /* ============================================================================
830
+ 滑块
831
+ ============================================================================ */
832
+
833
+ .taskon-switch__slider {
834
+ width: 14px;
835
+ height: 14px;
836
+ border-radius: 50%;
837
+ background: #fff;
838
+ transition: margin-left 0.3s ease;
839
+ }
840
+
841
+ /* 开启状态的滑块位置 */
842
+ .taskon-switch__button--active .taskon-switch__slider {
843
+ margin-left: 18px;
844
+ background: #25292c;
845
+ }
846
+
847
+ /* ============================================================================
848
+ 高亮样式 (highlight type)
849
+ ============================================================================ */
850
+
851
+ .taskon-switch--highlight .taskon-switch__button {
852
+ background: rgba(70, 70, 70, 0.2);
853
+ }
854
+
855
+ .taskon-switch--highlight .taskon-switch__button--active {
856
+ background: rgba(203, 255, 1, 0.1);
857
+ border: 1px solid rgba(255, 255, 255, 0.06);
858
+ }
859
+
860
+ .taskon-switch--highlight .taskon-switch__button--active .taskon-switch__slider {
861
+ background: #cbff01;
862
+ }
863
+
864
+ /* ============================================================================
865
+ 响应式 - 移动端适配
866
+ ============================================================================ */
867
+
868
+ @media (max-width: 750px) {
869
+ .taskon-switch {
870
+ font-weight: 500;
871
+ font-size: 12px;
872
+ line-height: 130%;
873
+ }
874
+
875
+ .taskon-switch__button {
876
+ width: 32px;
877
+ height: 18px;
878
+ padding: 2px;
879
+ margin-left: 10px;
880
+ }
881
+
882
+ .taskon-switch__slider {
883
+ width: 12px;
884
+ height: 12px;
885
+ }
886
+
887
+ .taskon-switch__button--active .taskon-switch__slider {
888
+ margin-left: 14px;
889
+ }
890
+ }
891
+ /**
892
+ * AssetImage 组件样式
893
+ */
894
+
895
+ .taskon-asset-image {
896
+ position: relative;
897
+ flex-shrink: 0;
898
+ }
899
+
900
+ .taskon-asset-image__main {
901
+ display: block;
902
+ width: 100%;
903
+ height: 100%;
904
+ border-radius: 4px;
905
+ object-fit: cover;
906
+ }
907
+
908
+ .taskon-asset-image__placeholder {
909
+ width: 100%;
910
+ height: 100%;
911
+ border-radius: 4px;
912
+ background-color: var(--taskon-bg-secondary, #f0f0f0);
913
+ }
914
+
915
+ .taskon-asset-image__chain {
916
+ position: absolute;
917
+ right: -4px;
918
+ bottom: -4px;
919
+ width: 18px;
920
+ height: 18px;
921
+ border-radius: 50%;
922
+ background-color: var(--taskon-bg-primary, #fff);
923
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
924
+ }
925
+ /**
926
+ * RewardTables 通用样式
927
+ */
928
+
929
+ .taskon-reward-table {
930
+ width: 100%;
931
+ }
932
+
933
+ /* Campaign 名称 */
934
+ .taskon-reward-table__campaign-name {
935
+ color: var(--taskon-color-text, #fff);
936
+ font-size: 14px;
937
+ font-weight: 500;
938
+ line-height: 1.5;
939
+ word-break: break-word;
940
+ }
941
+
942
+ /* Role 名称 */
943
+ .taskon-reward-table__role-name {
944
+ color: var(--taskon-color-text, #fff);
945
+ font-size: 14px;
946
+ font-weight: 500;
947
+ line-height: 1.5;
948
+ }
949
+
950
+ /* 时间 */
951
+ .taskon-reward-table__time {
952
+ color: var(--taskon-text-secondary, #666);
953
+ font-size: 13px;
954
+ white-space: nowrap;
955
+ }
956
+
957
+ /* 手动发放状态 */
958
+ .taskon-reward-table__manual-drop {
959
+ color: var(--taskon-text-tertiary, #999);
960
+ font-size: 13px;
961
+ }
962
+
963
+ /* 链接样式 */
964
+ .taskon-reward-table__link {
965
+ background: none;
966
+ border: none;
967
+ padding: 0;
968
+ color: var(--taskon-primary, #6366f1);
969
+ font-size: 13px;
970
+ cursor: pointer;
971
+ text-decoration: none;
972
+ }
973
+
974
+ .taskon-reward-table__link:hover {
975
+ text-decoration: underline;
976
+ }
977
+
978
+ /* Claim 按钮 */
979
+ .taskon-reward-table__claim-btn {
980
+ display: inline-flex;
981
+ align-items: center;
982
+ justify-content: center;
983
+ height: 28px;
984
+ padding: 0 12px;
985
+ background-color: var(--taskon-primary, #6366f1);
986
+ color: #fff;
987
+ font-size: 13px;
988
+ font-weight: 500;
989
+ border: none;
990
+ border-radius: 4px;
991
+ cursor: pointer;
992
+ transition: background-color 0.2s;
993
+ }
994
+
995
+ .taskon-reward-table__claim-btn:hover {
996
+ background-color: var(--taskon-primary-hover, #4f46e5);
997
+ }
998
+
999
+ /* Points 表格特殊样式 */
1000
+ .taskon-reward-table__points-name {
1001
+ display: flex;
1002
+ align-items: center;
1003
+ gap: 8px;
1004
+ }
1005
+
1006
+ .taskon-reward-table__points-icon {
1007
+ width: 20px;
1008
+ height: 20px;
1009
+ border-radius: 50%;
1010
+ flex-shrink: 0;
1011
+ }
1012
+
1013
+ .taskon-reward-table__points-amount {
1014
+ font-size: 14px;
1015
+ font-weight: 500;
1016
+ }
1017
+
1018
+ .taskon-reward-table__points-amount--positive {
1019
+ color: var(--taskon-success, #22c55e);
1020
+ }
1021
+
1022
+ .taskon-reward-table__points-amount--negative {
1023
+ color: var(--taskon-error, #ef4444);
1024
+ }
1025
+
1026
+ /* ========== Token History 表格样式 ========== */
1027
+
1028
+ /* Amount 列容器 */
1029
+ .taskon-token-history__amount {
1030
+ display: flex;
1031
+ flex-direction: column;
1032
+ align-items: flex-end;
1033
+ gap: 6px;
1034
+ }
1035
+
1036
+ /* Token 信息行 */
1037
+ .taskon-token-history__token-info {
1038
+ display: flex;
1039
+ align-items: center;
1040
+ gap: 4px;
1041
+ }
1042
+
1043
+ /* Token 金额值 */
1044
+ .taskon-token-history__token-value {
1045
+ color: var(--taskon-success, #22c55e);
1046
+ font-weight: 500;
1047
+ }
1048
+
1049
+ /* Token 名称 */
1050
+ .taskon-token-history__token-name {
1051
+ color: var(--taskon-color-text, #fff);
1052
+ }
1053
+
1054
+ /* 链图标 */
1055
+ .taskon-token-history__chain-icon {
1056
+ width: 18px;
1057
+ height: 18px;
1058
+ margin-left: 6px;
1059
+ border-radius: 50%;
1060
+ }
1061
+
1062
+ /* 分发方信息 */
1063
+ .taskon-token-history__distribute {
1064
+ display: flex;
1065
+ align-items: center;
1066
+ justify-content: flex-end;
1067
+ }
1068
+
1069
+ /* Deposited 标签(TaskOn 托管发放) */
1070
+ .taskon-token-history__deposited {
1071
+ font-size: 12px;
1072
+ line-height: 15px;
1073
+ background: linear-gradient(84deg, #e3bc4e 3%, #fffdb6 99.34%);
1074
+ background-clip: text;
1075
+ -webkit-background-clip: text;
1076
+ -webkit-text-fill-color: transparent;
1077
+ }
1078
+
1079
+ /* Distributed by 容器 */
1080
+ .taskon-token-history__distributed-by {
1081
+ display: flex;
1082
+ align-items: center;
1083
+ gap: 6px;
1084
+ }
1085
+
1086
+ /* Distributed by 标签 */
1087
+ .taskon-token-history__distributed-label {
1088
+ color: var(--taskon-text-tertiary, #999);
1089
+ font-size: 12px;
1090
+ line-height: 15px;
1091
+ }
1092
+
1093
+ /* 社区头像 */
1094
+ .taskon-token-history__community-avatar {
1095
+ width: 14px;
1096
+ height: 14px;
1097
+ border-radius: 50%;
1098
+ object-fit: cover;
1099
+ }
1100
+ /**
1101
+ * EmailBindDialog 样式
1102
+ */
1103
+
1104
+ .taskon-email-bind-dialog {
1105
+ padding: 8px 0;
1106
+ }
1107
+
1108
+ .taskon-email-bind-dialog__title {
1109
+ font-size: 20px;
1110
+ font-weight: 600;
1111
+ line-height: 28px;
1112
+ color: var(--taskon-color-text, #fff);
1113
+ margin: 0 0 24px 0;
1114
+ }
1115
+
1116
+ .taskon-email-bind-dialog__field {
1117
+ margin-bottom: 20px;
1118
+ }
1119
+
1120
+ .taskon-email-bind-dialog__label {
1121
+ display: block;
1122
+ font-size: 14px;
1123
+ font-weight: 500;
1124
+ line-height: 20px;
1125
+ color: var(--taskon-color-text, #fff);
1126
+ margin-bottom: 8px;
1127
+ }
1128
+
1129
+ .taskon-email-bind-dialog__actions {
1130
+ margin-top: 24px;
1131
+ }
1132
+
1133
+ /* 响应式 - 移动端 */
1134
+ @media (max-width: 750px) {
1135
+ .taskon-email-bind-dialog__title {
1136
+ font-size: 18px;
1137
+ line-height: 24px;
1138
+ margin-bottom: 16px;
1139
+ }
1140
+
1141
+ .taskon-email-bind-dialog__field {
1142
+ margin-bottom: 16px;
1143
+ }
1144
+
1145
+ .taskon-email-bind-dialog__label {
1146
+ font-size: 13px;
1147
+ margin-bottom: 6px;
1148
+ }
1149
+
1150
+ .taskon-email-bind-dialog__actions {
1151
+ margin-top: 20px;
1152
+ }
1153
+ }
1154
+ /**
1155
+ * ClaimNftDialog 样式
1156
+ */
1157
+
1158
+ .taskon-claim-dialog {
1159
+ max-width: 400px;
1160
+ }
1161
+
1162
+ .taskon-claim-dialog-content {
1163
+ display: flex;
1164
+ flex-direction: column;
1165
+ align-items: center;
1166
+ padding: 24px;
1167
+ text-align: center;
1168
+ }
1169
+
1170
+ /* NFT 图片 */
1171
+ .taskon-claim-dialog-nft {
1172
+ margin-bottom: 20px;
1173
+ }
1174
+
1175
+ .taskon-claim-dialog-nft__image {
1176
+ width: 120px;
1177
+ height: 120px;
1178
+ border-radius: 12px;
1179
+ object-fit: cover;
1180
+ }
1181
+
1182
+ /* 状态图标区域 */
1183
+ .taskon-claim-dialog-status {
1184
+ margin-bottom: 16px;
1185
+ min-height: 48px;
1186
+ display: flex;
1187
+ align-items: center;
1188
+ justify-content: center;
1189
+ }
1190
+
1191
+ /* 加载动画 */
1192
+ .taskon-claim-dialog-spinner {
1193
+ width: 48px;
1194
+ height: 48px;
1195
+ position: relative;
1196
+ }
1197
+
1198
+ .taskon-claim-dialog-spinner__circle {
1199
+ width: 100%;
1200
+ height: 100%;
1201
+ border: 3px solid var(--taskon-border-color, #e5e5e5);
1202
+ border-top-color: var(--taskon-primary-color, #6366f1);
1203
+ border-radius: 50%;
1204
+ animation: taskon-claim-spin 0.8s linear infinite;
1205
+ }
1206
+
1207
+ @keyframes taskon-claim-spin {
1208
+ to {
1209
+ transform: rotate(360deg);
1210
+ }
1211
+ }
1212
+
1213
+ /* 状态图标 */
1214
+ .taskon-claim-dialog-icon {
1215
+ width: 48px;
1216
+ height: 48px;
1217
+ }
1218
+
1219
+ .taskon-claim-dialog-icon--success {
1220
+ color: var(--taskon-success-color, #22c55e);
1221
+ }
1222
+
1223
+ .taskon-claim-dialog-icon--error {
1224
+ color: var(--taskon-error-color, #ef4444);
1225
+ }
1226
+
1227
+ /* 状态消息 */
1228
+ .taskon-claim-dialog-message {
1229
+ font-size: 16px;
1230
+ font-weight: 500;
1231
+ color: var(--taskon-text-color, #1a1a1a);
1232
+ margin: 0 0 16px;
1233
+ line-height: 1.5;
1234
+ }
1235
+
1236
+ /* 交易 Hash */
1237
+ .taskon-claim-dialog-tx {
1238
+ display: flex;
1239
+ align-items: center;
1240
+ gap: 8px;
1241
+ padding: 8px 16px;
1242
+ background: var(--taskon-bg-secondary, #f5f5f5);
1243
+ border-radius: 8px;
1244
+ margin-bottom: 20px;
1245
+ font-size: 14px;
1246
+ }
1247
+
1248
+ .taskon-claim-dialog-tx__label {
1249
+ color: var(--taskon-text-secondary, #666);
1250
+ }
1251
+
1252
+ .taskon-claim-dialog-tx__hash {
1253
+ color: var(--taskon-text-color, #1a1a1a);
1254
+ font-family: monospace;
1255
+ }
1256
+
1257
+ /* 操作按钮 */
1258
+ .taskon-claim-dialog-actions {
1259
+ display: flex;
1260
+ gap: 12px;
1261
+ width: 100%;
1262
+ justify-content: center;
1263
+ }
1264
+
1265
+ .taskon-claim-dialog-btn {
1266
+ padding: 10px 24px;
1267
+ border-radius: 8px;
1268
+ font-size: 14px;
1269
+ font-weight: 500;
1270
+ cursor: pointer;
1271
+ transition: all 0.2s ease;
1272
+ border: none;
1273
+ }
1274
+
1275
+ .taskon-claim-dialog-btn--primary {
1276
+ background: var(--taskon-primary-color, #6366f1);
1277
+ color: white;
1278
+ }
1279
+
1280
+ .taskon-claim-dialog-btn--primary:hover {
1281
+ background: var(--taskon-primary-hover, #4f46e5);
1282
+ }
1283
+
1284
+ .taskon-claim-dialog-btn--secondary {
1285
+ background: transparent;
1286
+ color: var(--taskon-primary-color, #6366f1);
1287
+ border: 1px solid var(--taskon-primary-color, #6366f1);
1288
+ }
1289
+
1290
+ .taskon-claim-dialog-btn--secondary:hover {
1291
+ background: var(--taskon-primary-color, #6366f1);
1292
+ color: white;
1293
+ }
1294
+ /**
1295
+ * TokenSelect 组件样式
1296
+ *
1297
+ * 基于 Vue WithdrawTokenSelect 组件样式
1298
+ */
1299
+
1300
+ /* ========== 自定义触发器样式 ========== */
1301
+ .taskon-token-select__label .taskon-select__trigger-icon {
1302
+ width: 16px;
1303
+ height: 16px;
1304
+ }
1305
+
1306
+ /* ========== 链信息 ========== */
1307
+ .taskon-token-select__chain-info {
1308
+ display: inline-flex;
1309
+ align-items: center;
1310
+ gap: 8px;
1311
+ width: 33.33%;
1312
+ min-width: 0;
1313
+ flex-shrink: 0;
1314
+ }
1315
+
1316
+ .taskon-token-select__chain-icon {
1317
+ width: 16px;
1318
+ height: 16px;
1319
+ border-radius: 50%;
1320
+ flex-shrink: 0;
1321
+ }
1322
+
1323
+ .taskon-token-select__chain-label {
1324
+ font-size: 14px;
1325
+ font-weight: 500;
1326
+ color: rgba(255, 255, 255, 0.8);
1327
+ overflow: hidden;
1328
+ text-overflow: ellipsis;
1329
+ white-space: nowrap;
1330
+ max-width: 100px;
1331
+ }
1332
+
1333
+ /* ========== 余额显示 ========== */
1334
+ .taskon-token-select__balance {
1335
+ font-size: 14px;
1336
+ color: rgba(255, 255, 255, 0.6);
1337
+ margin-left: auto;
1338
+ flex-shrink: 0;
1339
+ }
1340
+
1341
+ /* ========== 响应式 ========== */
1342
+ @media (max-width: 750px) {
1343
+ .taskon-token-select__chain-icon {
1344
+ width: 14px;
1345
+ height: 14px;
1346
+ }
1347
+
1348
+ .taskon-token-select__chain-label {
1349
+ font-size: 13px;
1350
+ max-width: 80px;
1351
+ }
1352
+
1353
+ .taskon-token-select__balance {
1354
+ font-size: 13px;
1355
+ }
1356
+ }
1357
+ /**
1358
+ * ReceiverAddress 组件样式
1359
+ *
1360
+ * 基于 Vue 版本样式实现
1361
+ * - 两列布局:链信息 + 地址
1362
+ * - 深色背景卡片样式
1363
+ */
1364
+
1365
+ /* ========== 根容器 ========== */
1366
+ .taskon-receiver-address {
1367
+ display: flex;
1368
+ align-items: center;
1369
+ gap: 8px;
1370
+ font-size: 14px;
1371
+ }
1372
+
1373
+ /* ========== 链信息 ========== */
1374
+ .taskon-receiver-address__chain {
1375
+ display: flex;
1376
+ align-items: center;
1377
+ gap: 8px;
1378
+ flex: 1;
1379
+ height: 46px;
1380
+ padding: 12px 20px;
1381
+ background: #121414;
1382
+ border-radius: 8px;
1383
+ font-weight: 500;
1384
+ color: #fff;
1385
+ }
1386
+
1387
+ /* ========== 链图标 ========== */
1388
+ .taskon-receiver-address__chain-icon {
1389
+ width: 20px;
1390
+ height: 20px;
1391
+ border-radius: 50%;
1392
+ flex-shrink: 0;
1393
+ }
1394
+
1395
+ /* ========== 链名称 ========== */
1396
+ .taskon-receiver-address__chain-label {
1397
+ overflow: hidden;
1398
+ text-overflow: ellipsis;
1399
+ white-space: nowrap;
1400
+ }
1401
+
1402
+ /* ========== 地址 ========== */
1403
+ .taskon-receiver-address__address {
1404
+ flex: 1;
1405
+ height: 46px;
1406
+ padding: 12px 20px;
1407
+ background: #121414;
1408
+ border-radius: 8px;
1409
+ font-weight: 500;
1410
+ color: #fff;
1411
+ display: flex;
1412
+ align-items: center;
1413
+ overflow: hidden;
1414
+ text-overflow: ellipsis;
1415
+ white-space: nowrap;
1416
+ }
1417
+
1418
+ /* ========== 响应式 ========== */
1419
+ @media (max-width: 750px) {
1420
+ .taskon-receiver-address {
1421
+ flex-direction: column;
1422
+ gap: 8px;
1423
+ }
1424
+
1425
+ .taskon-receiver-address__chain,
1426
+ .taskon-receiver-address__address {
1427
+ width: 100%;
1428
+ height: 40px;
1429
+ padding: 10px 16px;
1430
+ font-size: 13px;
1431
+ }
1432
+
1433
+ .taskon-receiver-address__chain-icon {
1434
+ width: 16px;
1435
+ height: 16px;
1436
+ }
1437
+ }
1438
+ /**
1439
+ * BatchTokenTable 组件样式
1440
+ *
1441
+ * 采用 BEM 命名规范
1442
+ * 前缀: taskon-batch-token-table
1443
+ *
1444
+ * 参考 Vue 版本 TokenTable.vue 样式实现
1445
+ */
1446
+
1447
+ /* ============================================================================
1448
+ 根容器
1449
+ ============================================================================ */
1450
+
1451
+ .taskon-batch-token-table {
1452
+ position: relative;
1453
+ width: 100%;
1454
+ }
1455
+
1456
+ /* ============================================================================
1457
+ 表格样式覆盖
1458
+ ============================================================================ */
1459
+
1460
+ .taskon-batch-token-table__table {
1461
+ min-height: auto;
1462
+ }
1463
+
1464
+ /* 表格紧凑模式下的行高调整 */
1465
+ .taskon-batch-token-table__table .taskon-table__row {
1466
+ height: 55px;
1467
+ }
1468
+
1469
+ /* 表头样式 */
1470
+ .taskon-batch-token-table__table .taskon-table__header {
1471
+ font-size: 14px;
1472
+ line-height: 32px;
1473
+ padding: 0 10px;
1474
+ }
1475
+
1476
+ /* 单元格样式 */
1477
+ .taskon-batch-token-table__table .taskon-table__cell {
1478
+ font-size: 14px;
1479
+ line-height: 20px;
1480
+ padding: 0 10px;
1481
+ font-weight: 400;
1482
+ }
1483
+
1484
+ /* ============================================================================
1485
+ 禁用行样式(不可提现)
1486
+ ============================================================================ */
1487
+
1488
+ .taskon-batch-token-table__row--disabled {
1489
+ opacity: 0.4;
1490
+ pointer-events: none;
1491
+ }
1492
+
1493
+ /* ============================================================================
1494
+ Token 单元格样式
1495
+ ============================================================================ */
1496
+
1497
+ .taskon-batch-token-table__token-cell {
1498
+ display: inline-flex;
1499
+ align-items: center;
1500
+ gap: 8px;
1501
+ }
1502
+
1503
+ .taskon-batch-token-table__token-icon {
1504
+ width: 20px;
1505
+ height: 20px;
1506
+ border-radius: 50%;
1507
+ object-fit: cover;
1508
+ }
1509
+
1510
+ /* ============================================================================
1511
+ 输入框样式
1512
+ ============================================================================ */
1513
+
1514
+ .taskon-batch-token-table__input {
1515
+ width: 96px;
1516
+ height: 32px;
1517
+ font-size: 14px;
1518
+ text-align: center;
1519
+ }
1520
+
1521
+ .taskon-batch-token-table__input .taskon-input {
1522
+ height: 32px;
1523
+ padding: 4px 8px;
1524
+ font-size: 14px;
1525
+ text-align: center;
1526
+ }
1527
+
1528
+ /* ============================================================================
1529
+ 分页样式
1530
+ ============================================================================ */
1531
+
1532
+ .taskon-batch-token-table__pagination {
1533
+ margin-top: 20px;
1534
+ display: flex;
1535
+ align-items: center;
1536
+ justify-content: center;
1537
+ }
1538
+
1539
+ /* ============================================================================
1540
+ 响应式 - 移动端适配
1541
+ ============================================================================ */
1542
+
1543
+ @media (max-width: 750px) {
1544
+ .taskon-batch-token-table__table .taskon-table__row {
1545
+ height: 44px;
1546
+ }
1547
+
1548
+ .taskon-batch-token-table__table .taskon-table__header {
1549
+ font-size: 12px;
1550
+ line-height: 24px;
1551
+ padding: 0 4px;
1552
+ }
1553
+
1554
+ .taskon-batch-token-table__table .taskon-table__cell {
1555
+ font-size: 12px;
1556
+ line-height: 16px;
1557
+ padding: 0 4px;
1558
+ }
1559
+
1560
+ .taskon-batch-token-table__token-icon {
1561
+ width: 16px;
1562
+ height: 16px;
1563
+ }
1564
+
1565
+ .taskon-batch-token-table__input {
1566
+ width: 64px;
1567
+ height: 28px;
1568
+ }
1569
+
1570
+ .taskon-batch-token-table__input .taskon-input {
1571
+ height: 28px;
1572
+ padding: 2px 4px;
1573
+ font-size: 12px;
1574
+ }
1575
+
1576
+ .taskon-batch-token-table__pagination {
1577
+ margin-top: 16px;
1578
+ }
1579
+ }
1580
+ /**
1581
+ * WithdrawFormInit 组件样式
1582
+ *
1583
+ * 提现表单初始状态的样式
1584
+ */
1585
+
1586
+ /* ========== 根容器 ========== */
1587
+ .taskon-withdraw-form-init {
1588
+ display: flex;
1589
+ flex-direction: column;
1590
+ }
1591
+
1592
+ /* ========== 标题 ========== */
1593
+ .taskon-withdraw-form-init__title {
1594
+ margin: 0 0 20px 0;
1595
+ font-size: 22px;
1596
+ font-weight: 600;
1597
+ color: #fff;
1598
+ line-height: 1.3;
1599
+ }
1600
+
1601
+ /* ========== 表单内容 ========== */
1602
+ .taskon-withdraw-form-init__content {
1603
+ display: flex;
1604
+ flex-direction: column;
1605
+ gap: 16px;
1606
+ }
1607
+
1608
+ /* ========== 批量提现开关 ========== */
1609
+ .taskon-withdraw-form-init__switch-wrap {
1610
+ display: flex;
1611
+ align-items: center;
1612
+ }
1613
+
1614
+ /* ========== 底部按钮 ========== */
1615
+ .taskon-withdraw-form-init__footer {
1616
+ margin-top: 24px;
1617
+ }
1618
+
1619
+ .taskon-withdraw-form-init__submit {
1620
+ width: 100% !important;
1621
+ }
1622
+
1623
+ /* ========== 响应式 ========== */
1624
+ @media (max-width: 750px) {
1625
+ .taskon-withdraw-form-init__title {
1626
+ font-size: 5.867vw;
1627
+ margin-bottom: 5.333vw;
1628
+ }
1629
+
1630
+ .taskon-withdraw-form-init__content {
1631
+ gap: 4.267vw;
1632
+ }
1633
+
1634
+ .taskon-withdraw-form-init__footer {
1635
+ margin-top: 6.4vw;
1636
+ }
1637
+ }
1638
+ /**
1639
+ * UserCenter Widget 样式
1640
+ *
1641
+ * BEM 命名规范: .taskon-user-center-[block]__[element]--[modifier]
1642
+ *
1643
+ * 基于 Figma UserCenter 设计规范 (暗色模式)
1644
+ * https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4000-1693
1645
+ */
1646
+
1647
+ /* ========== UserCenter 专用 CSS 变量 ========== */
1648
+ :root {
1649
+ /* UserCenter 暗色模式颜色系统 */
1650
+ --taskon-uc-color-bg-body: #0d0d0d;
1651
+ --taskon-uc-color-bg-card: linear-gradient(
1652
+ 90deg,
1653
+ rgba(255, 255, 255, 0.1) 0%,
1654
+ rgba(255, 255, 255, 0.1) 100%
1655
+ ), #0d0d0d;
1656
+
1657
+ /* 文字颜色层级 */
1658
+ --taskon-uc-color-text-lightest: #ffffff;
1659
+ --taskon-uc-color-text-light: rgba(255, 255, 255, 0.6);
1660
+ --taskon-uc-color-text-dark: rgba(255, 255, 255, 0.4);
1661
+ --taskon-uc-color-text-darkest: rgba(255, 255, 255, 0.1);
1662
+ --taskon-uc-color-text-invisible: rgba(255, 255, 255, 0.04);
1663
+
1664
+ /* 边框颜色 */
1665
+ --taskon-uc-color-border: rgba(255, 255, 255, 0.04);
1666
+ --taskon-uc-color-border-btn: rgba(255, 255, 255, 0.1);
1667
+
1668
+ /* 强调色 */
1669
+ --taskon-uc-color-link: #ffd465;
1670
+
1671
+ /* 间距系统 (基于 Figma) */
1672
+ --taskon-uc-spacing-xxs: 4px;
1673
+ --taskon-uc-spacing-xs: 8px;
1674
+ --taskon-uc-spacing-s: 12px;
1675
+ --taskon-uc-spacing-m: 16px;
1676
+ --taskon-uc-spacing-l: 20px;
1677
+ --taskon-uc-spacing-xl: 24px;
1678
+ --taskon-uc-spacing-xxl: 32px;
1679
+ --taskon-uc-spacing-3xl: 40px;
1680
+
1681
+ /* 圆角系统 */
1682
+ --taskon-uc-radius-s: 4px;
1683
+ --taskon-uc-radius-m: 6px;
1684
+ --taskon-uc-radius-l: 8px;
1685
+ }
1686
+
1687
+ /* ========== 容器 ========== */
1688
+ .taskon-user-center {
1689
+ display: flex;
1690
+ flex-direction: column;
1691
+ gap: var(--taskon-uc-spacing-xl, 24px);
1692
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
1693
+ background-color: var(--taskon-uc-color-bg-body, #0d0d0d);
1694
+ border-radius: var(--taskon-border-radius, 12px);
1695
+ padding: var(--taskon-spacing-lg, 24px);
1696
+ }
1697
+
1698
+ .taskon-user-center--error {
1699
+ border: 1px solid var(--taskon-color-error, #ef4444);
1700
+ }
1701
+
1702
+ /* 旧 Tab 栏样式已移除,使用通用 Tabs 组件 */
1703
+
1704
+ /* ========== 内容区域 ========== */
1705
+ .taskon-user-center-content {
1706
+ min-height: 200px;
1707
+ }
1708
+
1709
+ /* ========== 空状态 ========== */
1710
+ .taskon-user-center-empty {
1711
+ display: flex;
1712
+ flex-direction: column;
1713
+ align-items: center;
1714
+ justify-content: center;
1715
+ padding: var(--taskon-uc-spacing-3xl, 40px);
1716
+ text-align: center;
1717
+ }
1718
+
1719
+ .taskon-user-center-empty__icon {
1720
+ margin-bottom: var(--taskon-uc-spacing-m, 16px);
1721
+ color: var(--taskon-uc-color-text-dark, rgba(255, 255, 255, 0.4));
1722
+ }
1723
+
1724
+ .taskon-user-center-empty__message {
1725
+ font-size: 14px;
1726
+ color: var(--taskon-uc-color-text-dark, rgba(255, 255, 255, 0.4));
1727
+ margin: 0;
1728
+ }
1729
+
1730
+ /* ========== 加载状态 ========== */
1731
+ .taskon-user-center-loading {
1732
+ display: flex;
1733
+ flex-direction: column;
1734
+ align-items: center;
1735
+ justify-content: center;
1736
+ padding: var(--taskon-uc-spacing-3xl, 40px);
1737
+ }
1738
+
1739
+ .taskon-user-center-loading__spinner {
1740
+ width: 32px;
1741
+ height: 32px;
1742
+ border: 3px solid var(--taskon-uc-color-text-darkest, rgba(255, 255, 255, 0.1));
1743
+ border-top-color: var(--taskon-uc-color-text-lightest, #ffffff);
1744
+ border-radius: 50%;
1745
+ animation: taskon-spin 1s linear infinite;
1746
+ }
1747
+
1748
+ @keyframes taskon-spin {
1749
+ to {
1750
+ transform: rotate(360deg);
1751
+ }
1752
+ }
1753
+
1754
+ .taskon-user-center-loading__message {
1755
+ margin-top: var(--taskon-uc-spacing-m, 16px);
1756
+ font-size: 14px;
1757
+ color: var(--taskon-uc-color-text-dark, rgba(255, 255, 255, 0.4));
1758
+ }
1759
+
1760
+ /* ========== 分页器 (基于 Figma 设计) ========== */
1761
+ .taskon-user-center-pagination {
1762
+ display: flex;
1763
+ align-items: center;
1764
+ justify-content: center;
1765
+ gap: var(--taskon-uc-spacing-m, 16px);
1766
+ margin-top: var(--taskon-uc-spacing-3xl, 40px);
1767
+ }
1768
+
1769
+ .taskon-user-center-pagination__arrow {
1770
+ width: 30px;
1771
+ height: 30px;
1772
+ display: flex;
1773
+ align-items: center;
1774
+ justify-content: center;
1775
+ background: transparent;
1776
+ border: none;
1777
+ cursor: pointer;
1778
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
1779
+ transition: opacity 0.2s ease;
1780
+ }
1781
+
1782
+ .taskon-user-center-pagination__arrow:disabled {
1783
+ opacity: 0.3;
1784
+ cursor: not-allowed;
1785
+ }
1786
+
1787
+ .taskon-user-center-pagination__arrow svg {
1788
+ width: 24px;
1789
+ height: 24px;
1790
+ }
1791
+
1792
+ .taskon-user-center-pagination__info {
1793
+ font-size: 16px;
1794
+ font-weight: 400;
1795
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
1796
+ text-transform: capitalize;
1797
+ }
1798
+
1799
+ .taskon-user-center-pagination__info-current {
1800
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
1801
+ }
1802
+
1803
+ .taskon-user-center-pagination__info-total {
1804
+ color: var(--taskon-uc-color-text-dark, rgba(255, 255, 255, 0.4));
1805
+ }
1806
+
1807
+ .taskon-user-center-pagination__info {
1808
+ font-size: 14px;
1809
+ color: var(--taskon-color-text-secondary, #6b7280);
1810
+ }
1811
+
1812
+ /* ========== 错误状态 ========== */
1813
+ .taskon-user-center-error {
1814
+ display: flex;
1815
+ flex-direction: column;
1816
+ align-items: center;
1817
+ justify-content: center;
1818
+ padding: var(--taskon-spacing-xl, 48px);
1819
+ text-align: center;
1820
+ }
1821
+
1822
+ .taskon-user-center-error__message {
1823
+ font-size: 14px;
1824
+ color: var(--taskon-color-error, #ef4444);
1825
+ margin-bottom: var(--taskon-spacing-md, 16px);
1826
+ }
1827
+
1828
+ .taskon-user-center-error__retry {
1829
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-lg, 24px);
1830
+ font-size: 14px;
1831
+ color: #ffffff;
1832
+ background-color: var(--taskon-color-primary, #3b82f6);
1833
+ border: none;
1834
+ border-radius: var(--taskon-border-radius-sm, 6px);
1835
+ cursor: pointer;
1836
+ transition: background-color 0.2s ease;
1837
+ }
1838
+
1839
+ .taskon-user-center-error__retry:hover {
1840
+ background-color: var(--taskon-color-primary-dark, #2563eb);
1841
+ }
1842
+
1843
+ /* ========== Activity History ========== */
1844
+ .taskon-activity-history {
1845
+ width: 100%;
1846
+ }
1847
+
1848
+ /* 自定义单元格样式(配合公共 Table 组件使用) */
1849
+ .taskon-activity-history__name-cell {
1850
+ display: flex;
1851
+ flex-direction: column;
1852
+ align-items: flex-start;
1853
+ gap: 4px;
1854
+ }
1855
+
1856
+ .taskon-activity-history__cell--name {
1857
+ /* 名称列自动扩展 */
1858
+ }
1859
+
1860
+ .taskon-activity-history__cell--time {
1861
+ font-size: 13px;
1862
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
1863
+ }
1864
+
1865
+ .taskon-activity-history__campaign-name {
1866
+ font-size: 14px;
1867
+ font-weight: 500;
1868
+ color: var(--taskon-color-text-lightest, #ffffff);
1869
+ word-break: break-word;
1870
+ }
1871
+
1872
+ .taskon-activity-history__campaign-type {
1873
+ font-size: 12px;
1874
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
1875
+ padding: 2px 6px;
1876
+ background-color: var(--taskon-color-bg-secondary, rgba(255, 255, 255, 0.04));
1877
+ border-radius: 4px;
1878
+ }
1879
+
1880
+ .taskon-activity-history__load-more {
1881
+ display: flex;
1882
+ justify-content: center;
1883
+ margin-top: var(--taskon-spacing-md, 16px);
1884
+ }
1885
+
1886
+ .taskon-activity-history__load-more-btn {
1887
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-lg, 24px);
1888
+ font-size: 14px;
1889
+ color: var(--taskon-color-primary, #3b82f6);
1890
+ background: transparent;
1891
+ border: 1px solid var(--taskon-color-primary, #3b82f6);
1892
+ border-radius: var(--taskon-border-radius-sm, 6px);
1893
+ cursor: pointer;
1894
+ transition: all 0.2s ease;
1895
+ }
1896
+
1897
+ .taskon-activity-history__load-more-btn:hover:not(:disabled) {
1898
+ background-color: var(--taskon-color-primary, #3b82f6);
1899
+ color: #ffffff;
1900
+ }
1901
+
1902
+ .taskon-activity-history__load-more-btn:disabled {
1903
+ opacity: 0.5;
1904
+ cursor: not-allowed;
1905
+ }
1906
+
1907
+ .taskon-activity-history__loading-more {
1908
+ display: flex;
1909
+ justify-content: center;
1910
+ padding: var(--taskon-spacing-md, 16px);
1911
+ }
1912
+
1913
+ /* ========== Asset Carousel ========== */
1914
+ .taskon-asset-carousel {
1915
+ position: relative;
1916
+ display: flex;
1917
+ flex-direction: column;
1918
+ gap: var(--taskon-uc-spacing-m, 16px);
1919
+ margin-bottom: var(--taskon-uc-spacing-xxl, 32px);
1920
+ }
1921
+
1922
+ /* "You have earned" 标题 */
1923
+ .taskon-asset-carousel__title {
1924
+ font-size: 16px;
1925
+ font-weight: 600;
1926
+ line-height: 24px;
1927
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
1928
+ }
1929
+
1930
+ .taskon-asset-carousel--empty {
1931
+ display: none;
1932
+ }
1933
+
1934
+ .taskon-asset-carousel__container {
1935
+ display: flex;
1936
+ flex-wrap: wrap;
1937
+ gap: var(--taskon-uc-spacing-s, 12px);
1938
+ }
1939
+
1940
+ .taskon-asset-carousel__container::-webkit-scrollbar {
1941
+ display: none;
1942
+ }
1943
+
1944
+ /* 隐藏滚动箭头(改用 wrap 布局不需要箭头) */
1945
+ .taskon-asset-carousel__arrow {
1946
+ display: none;
1947
+ }
1948
+
1949
+ /* ========== Asset Card (基于 Figma 暗色模式设计) ========== */
1950
+ .taskon-asset-card {
1951
+ display: flex;
1952
+ flex-direction: column;
1953
+ gap: var(--taskon-uc-spacing-m, 16px);
1954
+ flex: 1 0 0;
1955
+ min-width: 120px;
1956
+ padding: var(--taskon-uc-spacing-m, 16px);
1957
+ background: linear-gradient(
1958
+ 90deg,
1959
+ rgba(255, 255, 255, 0.1) 0%,
1960
+ rgba(255, 255, 255, 0.1) 100%
1961
+ ), var(--taskon-uc-color-bg-body, #0d0d0d);
1962
+ border: 1px solid var(--taskon-uc-color-border, rgba(255, 255, 255, 0.04));
1963
+ border-radius: var(--taskon-uc-radius-l, 8px);
1964
+ cursor: pointer;
1965
+ transition: all 0.2s ease;
1966
+ }
1967
+
1968
+ .taskon-asset-card:hover {
1969
+ border-color: var(--taskon-uc-color-border-btn, rgba(255, 255, 255, 0.1));
1970
+ }
1971
+
1972
+ .taskon-asset-card--selected {
1973
+ border-color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
1974
+ }
1975
+
1976
+ /* 图标容器 - 默认深色背景 */
1977
+ .taskon-asset-card__icon {
1978
+ display: flex;
1979
+ align-items: center;
1980
+ justify-content: center;
1981
+ width: 48px;
1982
+ height: 48px;
1983
+ border-radius: 50%;
1984
+ background-color: rgba(255, 255, 255, 0.1);
1985
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
1986
+ flex-shrink: 0;
1987
+ }
1988
+
1989
+ /* Whitelist 图标使用白色背景 */
1990
+ .taskon-asset-card__icon--light {
1991
+ background-color: rgba(255, 255, 255, 1);
1992
+ }
1993
+
1994
+ .taskon-asset-card__icon-img {
1995
+ width: 48px;
1996
+ height: 48px;
1997
+ border-radius: 50%;
1998
+ object-fit: cover;
1999
+ }
2000
+
2001
+ /* Whitelist "WL" 文字图标样式 - 基于 Figma 设计 */
2002
+ .taskon-asset-card__icon-wl {
2003
+ font-size: 17.333px;
2004
+ font-weight: 900;
2005
+ letter-spacing: 0.6933px;
2006
+ color: var(--taskon-uc-color-bg-body, #0d0d0d);
2007
+ line-height: 1;
2008
+ }
2009
+
2010
+ /* NFT 文字图标样式 - 基于 Figma 设计 */
2011
+ .taskon-asset-card__icon-nft {
2012
+ font-size: 12px;
2013
+ font-weight: 700;
2014
+ letter-spacing: 0.5px;
2015
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2016
+ line-height: 1;
2017
+ }
2018
+
2019
+ /* 内容区域 */
2020
+ .taskon-asset-card__content {
2021
+ display: flex;
2022
+ flex-direction: column;
2023
+ gap: var(--taskon-uc-spacing-xxs, 4px);
2024
+ align-items: flex-start;
2025
+ text-align: left;
2026
+ }
2027
+
2028
+ /* 标题(如 Token, NFT) */
2029
+ .taskon-asset-card__title {
2030
+ font-size: 14px;
2031
+ font-weight: 500;
2032
+ line-height: 20px;
2033
+ color: var(--taskon-uc-color-text-dark, rgba(255, 255, 255, 0.4));
2034
+ }
2035
+
2036
+ /* 数值(如 $17,545) */
2037
+ .taskon-asset-card__value {
2038
+ font-size: 20px;
2039
+ font-weight: 600;
2040
+ line-height: 28px;
2041
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2042
+ }
2043
+
2044
+ /* ========== My Rewards Content (基于 Figma 暗色模式设计) ========== */
2045
+ .taskon-my-rewards {
2046
+ width: 100%;
2047
+ display: flex;
2048
+ flex-direction: column;
2049
+ gap: var(--taskon-uc-spacing-xxl, 32px);
2050
+ }
2051
+
2052
+ .taskon-my-rewards__section {
2053
+ display: flex;
2054
+ flex-direction: column;
2055
+ gap: var(--taskon-uc-spacing-m, 16px);
2056
+ }
2057
+
2058
+ .taskon-my-rewards__section:last-child {
2059
+ margin-bottom: 0;
2060
+ }
2061
+
2062
+ .taskon-my-rewards__section-title {
2063
+ font-size: 16px;
2064
+ font-weight: 600;
2065
+ line-height: 24px;
2066
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2067
+ }
2068
+
2069
+ /* ========== Token Asset List (使用通用 Table 组件) ========== */
2070
+ .taskon-token-assets {
2071
+ width: 100%;
2072
+ display: flex;
2073
+ flex-direction: column;
2074
+ }
2075
+
2076
+ /* ========== WithdrawPending 组件(参考 Vue 版本 WithdrawPending.vue) ========== */
2077
+ .taskon-withdraw-pending {
2078
+ display: flex;
2079
+ align-items: center;
2080
+ justify-content: space-between;
2081
+ gap: 40px;
2082
+ padding: 12px 24px;
2083
+ margin-bottom: var(--taskon-uc-spacing-xs, 8px);
2084
+ background-color: rgba(0, 255, 163, 0.2);
2085
+ border-radius: var(--taskon-uc-radius-s, 4px);
2086
+ font-weight: 500;
2087
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2088
+ cursor: pointer;
2089
+ transition: background-color 0.2s ease;
2090
+ }
2091
+
2092
+ .taskon-withdraw-pending:hover {
2093
+ background-color: rgba(0, 255, 163, 0.3);
2094
+ }
2095
+
2096
+ .taskon-withdraw-pending__left {
2097
+ display: flex;
2098
+ align-items: center;
2099
+ gap: 8px;
2100
+ }
2101
+
2102
+ /* 数字徽章 */
2103
+ .taskon-withdraw-pending__count {
2104
+ padding: 4px 8px;
2105
+ font-size: 14px;
2106
+ line-height: 1;
2107
+ text-align: right;
2108
+ white-space: nowrap;
2109
+ background-color: var(--taskon-uc-color-bg-darkest, #0a0a0a);
2110
+ border-radius: var(--taskon-uc-radius-s, 4px);
2111
+ }
2112
+
2113
+ /* 提示文字 */
2114
+ .taskon-withdraw-pending__text {
2115
+ font-size: 16px;
2116
+ white-space: nowrap;
2117
+ }
2118
+
2119
+ /* 箭头图标 */
2120
+ .taskon-withdraw-pending__arrow {
2121
+ flex-shrink: 0;
2122
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2123
+ }
2124
+
2125
+ /* Token Symbol 单元格 */
2126
+ .taskon-token-assets__symbol-cell {
2127
+ display: flex;
2128
+ align-items: center;
2129
+ gap: var(--taskon-uc-spacing-xs, 8px);
2130
+ }
2131
+
2132
+ /* Network 单元格 */
2133
+ .taskon-token-assets__network-cell {
2134
+ display: flex;
2135
+ align-items: center;
2136
+ gap: var(--taskon-uc-spacing-xs, 8px);
2137
+ }
2138
+
2139
+ /* Token 图标 */
2140
+ .taskon-token-assets__token-icon {
2141
+ width: 24px;
2142
+ height: 24px;
2143
+ border-radius: 50%;
2144
+ object-fit: cover;
2145
+ flex-shrink: 0;
2146
+ }
2147
+
2148
+ /* 链图标 */
2149
+ .taskon-token-assets__chain-icon {
2150
+ width: 24px;
2151
+ height: 24px;
2152
+ border-radius: 50%;
2153
+ object-fit: cover;
2154
+ flex-shrink: 0;
2155
+ }
2156
+
2157
+ /* Token 符号 */
2158
+ .taskon-token-assets__symbol {
2159
+ font-size: 14px;
2160
+ font-weight: 400;
2161
+ line-height: normal;
2162
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2163
+ text-transform: capitalize;
2164
+ }
2165
+
2166
+ /* 链名称 */
2167
+ .taskon-token-assets__chain {
2168
+ font-size: 14px;
2169
+ font-weight: 400;
2170
+ line-height: normal;
2171
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2172
+ text-transform: capitalize;
2173
+ }
2174
+
2175
+ /* 余额 */
2176
+ .taskon-token-assets__balance {
2177
+ font-size: 14px;
2178
+ font-weight: 400;
2179
+ line-height: normal;
2180
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2181
+ text-overflow: ellipsis;
2182
+ overflow: hidden;
2183
+ white-space: nowrap;
2184
+ }
2185
+
2186
+ /* 提现按钮(覆盖通用 Button 样式以匹配设计) */
2187
+ .taskon-token-assets__withdraw-btn {
2188
+ min-width: auto;
2189
+ padding: var(--taskon-uc-spacing-xs, 8px) var(--taskon-uc-spacing-l, 20px) !important;
2190
+ height: 34px !important;
2191
+ border-color: var(--taskon-uc-color-border-btn, rgba(255, 255, 255, 0.1)) !important;
2192
+ }
2193
+
2194
+ .taskon-token-assets__withdraw-btn:hover:not(:disabled) {
2195
+ border-color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6)) !important;
2196
+ }
2197
+
2198
+ /* ========== Reward Detail List ========== */
2199
+ .taskon-reward-detail {
2200
+ width: 100%;
2201
+ }
2202
+
2203
+ .taskon-reward-detail__list {
2204
+ display: flex;
2205
+ flex-direction: column;
2206
+ border: 1px solid var(--taskon-color-border, #e5e7eb);
2207
+ border-radius: var(--taskon-border-radius-sm, 6px);
2208
+ overflow: hidden;
2209
+ }
2210
+
2211
+ .taskon-reward-detail__row {
2212
+ display: flex;
2213
+ align-items: center;
2214
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-md, 16px);
2215
+ border-bottom: 1px solid var(--taskon-color-border, #e5e7eb);
2216
+ transition: background-color 0.2s ease;
2217
+ }
2218
+
2219
+ .taskon-reward-detail__row:last-child {
2220
+ border-bottom: none;
2221
+ }
2222
+
2223
+ .taskon-reward-detail__row:hover {
2224
+ background-color: var(--taskon-color-bg-hover, #f3f4f6);
2225
+ }
2226
+
2227
+ .taskon-reward-detail__row[role="button"] {
2228
+ cursor: pointer;
2229
+ }
2230
+
2231
+ .taskon-reward-detail__row--nft {
2232
+ padding: var(--taskon-spacing-md, 16px);
2233
+ }
2234
+
2235
+ .taskon-reward-detail__cell {
2236
+ display: flex;
2237
+ align-items: center;
2238
+ }
2239
+
2240
+ .taskon-reward-detail__cell--icon {
2241
+ width: 32px;
2242
+ margin-right: var(--taskon-spacing-sm, 8px);
2243
+ }
2244
+
2245
+ .taskon-reward-detail__cell--nft-image {
2246
+ width: 60px;
2247
+ margin-right: var(--taskon-spacing-md, 16px);
2248
+ }
2249
+
2250
+ .taskon-reward-detail__cell--main {
2251
+ flex: 1;
2252
+ display: flex;
2253
+ flex-direction: column;
2254
+ gap: 2px;
2255
+ overflow: hidden;
2256
+ }
2257
+
2258
+ .taskon-reward-detail__cell--time {
2259
+ font-size: 13px;
2260
+ color: var(--taskon-color-text-secondary, #6b7280);
2261
+ white-space: nowrap;
2262
+ }
2263
+
2264
+ .taskon-reward-detail__cell--action {
2265
+ margin-left: var(--taskon-spacing-md, 16px);
2266
+ }
2267
+
2268
+ .taskon-reward-detail__token-icon {
2269
+ width: 32px;
2270
+ height: 32px;
2271
+ border-radius: 50%;
2272
+ object-fit: cover;
2273
+ }
2274
+
2275
+ .taskon-reward-detail__nft-image {
2276
+ width: 60px;
2277
+ height: 60px;
2278
+ border-radius: var(--taskon-border-radius-sm, 6px);
2279
+ object-fit: cover;
2280
+ }
2281
+
2282
+ .taskon-reward-detail__primary {
2283
+ font-size: 14px;
2284
+ font-weight: 500;
2285
+ color: var(--taskon-color-text, #1f2937);
2286
+ white-space: nowrap;
2287
+ overflow: hidden;
2288
+ text-overflow: ellipsis;
2289
+ }
2290
+
2291
+ .taskon-reward-detail__secondary {
2292
+ font-size: 12px;
2293
+ color: var(--taskon-color-text-secondary, #6b7280);
2294
+ white-space: nowrap;
2295
+ overflow: hidden;
2296
+ text-overflow: ellipsis;
2297
+ }
2298
+
2299
+ .taskon-reward-detail__claim-btn {
2300
+ padding: var(--taskon-spacing-xs, 4px) var(--taskon-spacing-md, 16px);
2301
+ font-size: 14px;
2302
+ font-weight: 500;
2303
+ color: #ffffff;
2304
+ background-color: var(--taskon-color-primary, #3b82f6);
2305
+ border: none;
2306
+ border-radius: var(--taskon-border-radius-sm, 6px);
2307
+ cursor: pointer;
2308
+ transition: background-color 0.2s ease;
2309
+ }
2310
+
2311
+ .taskon-reward-detail__claim-btn:hover {
2312
+ background-color: var(--taskon-color-primary-dark, #2563eb);
2313
+ }
2314
+
2315
+ .taskon-reward-detail__claimed {
2316
+ font-size: 14px;
2317
+ color: var(--taskon-color-success, #10b981);
2318
+ }
2319
+
2320
+ .taskon-reward-detail__loading-more {
2321
+ display: flex;
2322
+ justify-content: center;
2323
+ padding: var(--taskon-spacing-md, 16px);
2324
+ }
2325
+
2326
+ /* ========== Withdraw Modal ========== */
2327
+ .taskon-withdraw-modal {
2328
+ position: fixed;
2329
+ inset: 0;
2330
+ z-index: 1000;
2331
+ display: flex;
2332
+ align-items: center;
2333
+ justify-content: center;
2334
+ }
2335
+
2336
+ .taskon-withdraw-modal__overlay {
2337
+ position: absolute;
2338
+ inset: 0;
2339
+ background-color: rgba(0, 0, 0, 0.5);
2340
+ }
2341
+
2342
+ .taskon-withdraw-modal__content {
2343
+ position: relative;
2344
+ width: 90%;
2345
+ max-width: 400px;
2346
+ max-height: 90vh;
2347
+ background-color: var(--taskon-color-bg, #ffffff);
2348
+ border-radius: var(--taskon-border-radius, 12px);
2349
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
2350
+ overflow: hidden;
2351
+ display: flex;
2352
+ flex-direction: column;
2353
+ }
2354
+
2355
+ .taskon-withdraw-modal__header {
2356
+ display: flex;
2357
+ align-items: center;
2358
+ justify-content: space-between;
2359
+ padding: var(--taskon-spacing-md, 16px) var(--taskon-spacing-lg, 24px);
2360
+ border-bottom: 1px solid var(--taskon-color-border, #e5e7eb);
2361
+ }
2362
+
2363
+ .taskon-withdraw-modal__title {
2364
+ font-size: 18px;
2365
+ font-weight: 600;
2366
+ color: var(--taskon-color-text, #1f2937);
2367
+ margin: 0;
2368
+ }
2369
+
2370
+ .taskon-withdraw-modal__close {
2371
+ display: flex;
2372
+ align-items: center;
2373
+ justify-content: center;
2374
+ padding: 4px;
2375
+ background: none;
2376
+ border: none;
2377
+ color: var(--taskon-color-text-secondary, #6b7280);
2378
+ cursor: pointer;
2379
+ transition: color 0.2s ease;
2380
+ }
2381
+
2382
+ .taskon-withdraw-modal__close:hover:not(:disabled) {
2383
+ color: var(--taskon-color-text, #1f2937);
2384
+ }
2385
+
2386
+ .taskon-withdraw-modal__close:disabled {
2387
+ opacity: 0.5;
2388
+ cursor: not-allowed;
2389
+ }
2390
+
2391
+ .taskon-withdraw-modal__body {
2392
+ padding: var(--taskon-spacing-lg, 24px);
2393
+ overflow-y: auto;
2394
+ }
2395
+
2396
+ .taskon-withdraw-modal__icon {
2397
+ display: flex;
2398
+ justify-content: center;
2399
+ margin-bottom: var(--taskon-spacing-md, 16px);
2400
+ }
2401
+
2402
+ .taskon-withdraw-modal__icon--success {
2403
+ color: var(--taskon-color-success, #10b981);
2404
+ }
2405
+
2406
+ .taskon-withdraw-modal__icon--warning {
2407
+ color: var(--taskon-color-warning, #f59e0b);
2408
+ }
2409
+
2410
+ .taskon-withdraw-modal__message {
2411
+ font-size: 14px;
2412
+ color: var(--taskon-color-text, #1f2937);
2413
+ text-align: center;
2414
+ margin: 0;
2415
+ }
2416
+
2417
+ .taskon-withdraw-modal__tx-hash {
2418
+ font-size: 12px;
2419
+ color: var(--taskon-color-text-secondary, #6b7280);
2420
+ text-align: center;
2421
+ margin-top: var(--taskon-spacing-sm, 8px);
2422
+ word-break: break-all;
2423
+ }
2424
+
2425
+ .taskon-withdraw-modal__tokens {
2426
+ display: flex;
2427
+ flex-direction: column;
2428
+ gap: var(--taskon-spacing-sm, 8px);
2429
+ }
2430
+
2431
+ .taskon-withdraw-modal__token-item {
2432
+ display: flex;
2433
+ align-items: center;
2434
+ justify-content: space-between;
2435
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-md, 16px);
2436
+ background-color: var(--taskon-color-bg-secondary, #f9fafb);
2437
+ border-radius: var(--taskon-border-radius-sm, 6px);
2438
+ }
2439
+
2440
+ .taskon-withdraw-modal__token-info {
2441
+ display: flex;
2442
+ align-items: center;
2443
+ gap: var(--taskon-spacing-sm, 8px);
2444
+ }
2445
+
2446
+ .taskon-withdraw-modal__token-icon {
2447
+ width: 32px;
2448
+ height: 32px;
2449
+ border-radius: 50%;
2450
+ object-fit: cover;
2451
+ }
2452
+
2453
+ .taskon-withdraw-modal__token-details {
2454
+ display: flex;
2455
+ flex-direction: column;
2456
+ gap: 2px;
2457
+ }
2458
+
2459
+ .taskon-withdraw-modal__token-symbol {
2460
+ font-size: 14px;
2461
+ font-weight: 500;
2462
+ color: var(--taskon-color-text, #1f2937);
2463
+ }
2464
+
2465
+ .taskon-withdraw-modal__token-chain {
2466
+ font-size: 12px;
2467
+ color: var(--taskon-color-text-secondary, #6b7280);
2468
+ }
2469
+
2470
+ .taskon-withdraw-modal__token-amount {
2471
+ font-size: 16px;
2472
+ font-weight: 600;
2473
+ color: var(--taskon-color-text, #1f2937);
2474
+ }
2475
+
2476
+ .taskon-withdraw-modal__error {
2477
+ margin-top: var(--taskon-spacing-md, 16px);
2478
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-md, 16px);
2479
+ font-size: 14px;
2480
+ color: var(--taskon-color-error, #ef4444);
2481
+ background-color: var(--taskon-color-error-light, #fef2f2);
2482
+ border-radius: var(--taskon-border-radius-sm, 6px);
2483
+ }
2484
+
2485
+ .taskon-withdraw-modal__footer {
2486
+ display: flex;
2487
+ gap: var(--taskon-spacing-sm, 8px);
2488
+ padding: var(--taskon-spacing-md, 16px) var(--taskon-spacing-lg, 24px);
2489
+ border-top: 1px solid var(--taskon-color-border, #e5e7eb);
2490
+ }
2491
+
2492
+ .taskon-withdraw-modal__btn {
2493
+ flex: 1;
2494
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-lg, 24px);
2495
+ font-size: 14px;
2496
+ font-weight: 500;
2497
+ border: none;
2498
+ border-radius: var(--taskon-border-radius-sm, 6px);
2499
+ cursor: pointer;
2500
+ transition: all 0.2s ease;
2501
+ }
2502
+
2503
+ .taskon-withdraw-modal__btn--primary {
2504
+ color: #ffffff;
2505
+ background-color: var(--taskon-color-primary, #3b82f6);
2506
+ }
2507
+
2508
+ .taskon-withdraw-modal__btn--primary:hover:not(:disabled) {
2509
+ background-color: var(--taskon-color-primary-dark, #2563eb);
2510
+ }
2511
+
2512
+ .taskon-withdraw-modal__btn--secondary {
2513
+ color: var(--taskon-color-text, #1f2937);
2514
+ background-color: var(--taskon-color-bg-secondary, #f9fafb);
2515
+ }
2516
+
2517
+ .taskon-withdraw-modal__btn--secondary:hover:not(:disabled) {
2518
+ background-color: var(--taskon-color-bg-hover, #f3f4f6);
2519
+ }
2520
+
2521
+ .taskon-withdraw-modal__btn:disabled {
2522
+ opacity: 0.5;
2523
+ cursor: not-allowed;
2524
+ }
2525
+
2526
+ .taskon-withdraw-modal__loading {
2527
+ display: flex;
2528
+ align-items: center;
2529
+ justify-content: center;
2530
+ gap: var(--taskon-spacing-sm, 8px);
2531
+ }
2532
+
2533
+ .taskon-withdraw-modal__spinner {
2534
+ width: 16px;
2535
+ height: 16px;
2536
+ border: 2px solid rgba(255, 255, 255, 0.3);
2537
+ border-top-color: #ffffff;
2538
+ border-radius: 50%;
2539
+ animation: taskon-spin 1s linear infinite;
2540
+ }
2541
+
2542
+ /* ========== Frozen Asset List ========== */
2543
+ .taskon-frozen-assets {
2544
+ width: 100%;
2545
+ }
2546
+
2547
+ .taskon-frozen-assets__header {
2548
+ display: flex;
2549
+ align-items: center;
2550
+ justify-content: space-between;
2551
+ margin-bottom: var(--taskon-spacing-md, 16px);
2552
+ }
2553
+
2554
+ .taskon-frozen-assets__title {
2555
+ font-size: 16px;
2556
+ font-weight: 600;
2557
+ color: var(--taskon-color-text, #1f2937);
2558
+ margin: 0;
2559
+ }
2560
+
2561
+ .taskon-frozen-assets__close {
2562
+ display: flex;
2563
+ align-items: center;
2564
+ justify-content: center;
2565
+ padding: 4px;
2566
+ background: none;
2567
+ border: none;
2568
+ color: var(--taskon-color-text-secondary, #6b7280);
2569
+ cursor: pointer;
2570
+ transition: color 0.2s ease;
2571
+ }
2572
+
2573
+ .taskon-frozen-assets__close:hover {
2574
+ color: var(--taskon-color-text, #1f2937);
2575
+ }
2576
+
2577
+ .taskon-frozen-assets__list {
2578
+ display: flex;
2579
+ flex-direction: column;
2580
+ gap: var(--taskon-spacing-sm, 8px);
2581
+ }
2582
+
2583
+ .taskon-frozen-assets__item {
2584
+ display: flex;
2585
+ align-items: center;
2586
+ justify-content: space-between;
2587
+ padding: var(--taskon-spacing-md, 16px);
2588
+ background-color: var(--taskon-color-bg-secondary, #f9fafb);
2589
+ border-radius: var(--taskon-border-radius, 12px);
2590
+ }
2591
+
2592
+ .taskon-frozen-assets__info {
2593
+ display: flex;
2594
+ flex-direction: column;
2595
+ gap: 4px;
2596
+ }
2597
+
2598
+ .taskon-frozen-assets__details {
2599
+ display: flex;
2600
+ flex-direction: column;
2601
+ gap: 2px;
2602
+ }
2603
+
2604
+ .taskon-frozen-assets__amount {
2605
+ font-size: 16px;
2606
+ font-weight: 600;
2607
+ color: var(--taskon-color-text, #1f2937);
2608
+ }
2609
+
2610
+ .taskon-frozen-assets__type {
2611
+ font-size: 12px;
2612
+ color: var(--taskon-color-text-secondary, #6b7280);
2613
+ }
2614
+
2615
+ .taskon-frozen-assets__campaign {
2616
+ font-size: 12px;
2617
+ color: var(--taskon-color-text-secondary, #6b7280);
2618
+ }
2619
+
2620
+ .taskon-frozen-assets__time {
2621
+ font-size: 12px;
2622
+ color: var(--taskon-color-text-secondary, #6b7280);
2623
+ }
2624
+
2625
+ .taskon-frozen-assets__resend-btn {
2626
+ padding: var(--taskon-spacing-xs, 4px) var(--taskon-spacing-md, 16px);
2627
+ font-size: 14px;
2628
+ color: var(--taskon-color-primary, #3b82f6);
2629
+ background: transparent;
2630
+ border: 1px solid var(--taskon-color-primary, #3b82f6);
2631
+ border-radius: var(--taskon-border-radius-sm, 6px);
2632
+ cursor: pointer;
2633
+ transition: all 0.2s ease;
2634
+ }
2635
+
2636
+ .taskon-frozen-assets__resend-btn:hover {
2637
+ background-color: var(--taskon-color-primary, #3b82f6);
2638
+ color: #ffffff;
2639
+ }
2640
+
2641
+ /* ========== Progress Bar ========== */
2642
+ .taskon-progress-bar {
2643
+ width: 100%;
2644
+ }
2645
+
2646
+ .taskon-progress-bar__container {
2647
+ width: 100%;
2648
+ height: 8px;
2649
+ background-color: var(--taskon-color-bg-secondary, #f3f4f6);
2650
+ border-radius: 9999px;
2651
+ overflow: hidden;
2652
+ }
2653
+
2654
+ .taskon-progress-bar__fill {
2655
+ height: 100%;
2656
+ background-color: var(--taskon-color-primary, #3b82f6);
2657
+ border-radius: 9999px;
2658
+ transition: width 0.3s ease;
2659
+ }
2660
+
2661
+ .taskon-progress-bar__info {
2662
+ display: flex;
2663
+ justify-content: space-between;
2664
+ align-items: center;
2665
+ margin-top: var(--taskon-spacing-xs, 4px);
2666
+ font-size: 12px;
2667
+ color: var(--taskon-color-text-secondary, #6b7280);
2668
+ }
2669
+
2670
+ .taskon-progress-bar__values {
2671
+ font-weight: 500;
2672
+ }
2673
+
2674
+ .taskon-progress-bar__percent {
2675
+ font-weight: 600;
2676
+ color: var(--taskon-color-primary, #3b82f6);
2677
+ }
2678
+
2679
+ /* ========== XP Level Card ========== */
2680
+ .taskon-xp-level-card {
2681
+ width: 100%;
2682
+ }
2683
+
2684
+ .taskon-xp-level-card__header {
2685
+ display: flex;
2686
+ align-items: center;
2687
+ justify-content: space-between;
2688
+ margin-bottom: var(--taskon-spacing-md, 16px);
2689
+ }
2690
+
2691
+ .taskon-xp-level-card__level {
2692
+ display: flex;
2693
+ align-items: center;
2694
+ gap: var(--taskon-spacing-sm, 8px);
2695
+ }
2696
+
2697
+ .taskon-xp-level-card__level-badge {
2698
+ display: flex;
2699
+ align-items: center;
2700
+ justify-content: center;
2701
+ width: 48px;
2702
+ height: 48px;
2703
+ background: linear-gradient(135deg, var(--taskon-color-primary, #3b82f6), var(--taskon-color-primary-dark, #2563eb));
2704
+ border-radius: 50%;
2705
+ color: #ffffff;
2706
+ font-size: 18px;
2707
+ font-weight: 700;
2708
+ }
2709
+
2710
+ .taskon-xp-level-card__level-info {
2711
+ display: flex;
2712
+ flex-direction: column;
2713
+ gap: 2px;
2714
+ }
2715
+
2716
+ .taskon-xp-level-card__level-label {
2717
+ font-size: 12px;
2718
+ color: var(--taskon-color-text-secondary, #6b7280);
2719
+ }
2720
+
2721
+ .taskon-xp-level-card__level-value {
2722
+ font-size: 20px;
2723
+ font-weight: 700;
2724
+ color: var(--taskon-color-text, #1f2937);
2725
+ }
2726
+
2727
+ .taskon-xp-level-card__xp {
2728
+ display: flex;
2729
+ flex-direction: column;
2730
+ align-items: flex-end;
2731
+ gap: 2px;
2732
+ }
2733
+
2734
+ .taskon-xp-level-card__xp-label {
2735
+ font-size: 12px;
2736
+ color: var(--taskon-color-text-secondary, #6b7280);
2737
+ }
2738
+
2739
+ .taskon-xp-level-card__xp-value {
2740
+ font-size: 18px;
2741
+ font-weight: 600;
2742
+ color: var(--taskon-color-text, #1f2937);
2743
+ }
2744
+
2745
+ .taskon-xp-level-card__progress {
2746
+ margin-bottom: var(--taskon-spacing-lg, 24px);
2747
+ }
2748
+
2749
+ .taskon-xp-level-card__progress-label {
2750
+ display: flex;
2751
+ justify-content: space-between;
2752
+ align-items: center;
2753
+ margin-bottom: var(--taskon-spacing-xs, 4px);
2754
+ font-size: 12px;
2755
+ color: var(--taskon-color-text-secondary, #6b7280);
2756
+ }
2757
+
2758
+ .taskon-xp-level-card__history-title {
2759
+ font-size: 16px;
2760
+ font-weight: 600;
2761
+ color: var(--taskon-color-text, #1f2937);
2762
+ margin-bottom: var(--taskon-spacing-md, 16px);
2763
+ }
2764
+
2765
+ /* ========== Points List ========== */
2766
+ .taskon-points-list {
2767
+ width: 100%;
2768
+ }
2769
+
2770
+ .taskon-points-list__header {
2771
+ display: flex;
2772
+ align-items: center;
2773
+ gap: var(--taskon-spacing-sm, 8px);
2774
+ margin-bottom: var(--taskon-spacing-md, 16px);
2775
+ }
2776
+
2777
+ .taskon-points-list__icon {
2778
+ width: 32px;
2779
+ height: 32px;
2780
+ border-radius: 50%;
2781
+ object-fit: cover;
2782
+ }
2783
+
2784
+ .taskon-points-list__title {
2785
+ font-size: 16px;
2786
+ font-weight: 600;
2787
+ color: var(--taskon-color-text, #1f2937);
2788
+ margin: 0;
2789
+ }
2790
+
2791
+ .taskon-points-list__total {
2792
+ display: flex;
2793
+ align-items: baseline;
2794
+ gap: var(--taskon-spacing-xs, 4px);
2795
+ margin-left: auto;
2796
+ }
2797
+
2798
+ .taskon-points-list__total-value {
2799
+ font-size: 20px;
2800
+ font-weight: 700;
2801
+ color: var(--taskon-color-text, #1f2937);
2802
+ }
2803
+
2804
+ .taskon-points-list__total-label {
2805
+ font-size: 12px;
2806
+ color: var(--taskon-color-text-secondary, #6b7280);
2807
+ }
2808
+
2809
+ .taskon-points-list__table {
2810
+ width: 100%;
2811
+ border: 1px solid var(--taskon-color-border, #e5e7eb);
2812
+ border-radius: var(--taskon-border-radius-sm, 6px);
2813
+ overflow: hidden;
2814
+ }
2815
+
2816
+ .taskon-points-list__row {
2817
+ display: flex;
2818
+ align-items: center;
2819
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-md, 16px);
2820
+ border-bottom: 1px solid var(--taskon-color-border, #e5e7eb);
2821
+ transition: background-color 0.2s ease;
2822
+ }
2823
+
2824
+ .taskon-points-list__row:last-child {
2825
+ border-bottom: none;
2826
+ }
2827
+
2828
+ .taskon-points-list__row:hover {
2829
+ background-color: var(--taskon-color-bg-hover, #f3f4f6);
2830
+ }
2831
+
2832
+ .taskon-points-list__cell {
2833
+ display: flex;
2834
+ align-items: center;
2835
+ }
2836
+
2837
+ .taskon-points-list__cell--main {
2838
+ flex: 1;
2839
+ display: flex;
2840
+ flex-direction: column;
2841
+ gap: 2px;
2842
+ overflow: hidden;
2843
+ }
2844
+
2845
+ .taskon-points-list__cell--amount {
2846
+ font-size: 14px;
2847
+ font-weight: 600;
2848
+ white-space: nowrap;
2849
+ }
2850
+
2851
+ .taskon-points-list__cell--amount.positive {
2852
+ color: var(--taskon-color-success, #10b981);
2853
+ }
2854
+
2855
+ .taskon-points-list__cell--amount.negative {
2856
+ color: var(--taskon-color-error, #ef4444);
2857
+ }
2858
+
2859
+ .taskon-points-list__cell--time {
2860
+ font-size: 13px;
2861
+ color: var(--taskon-color-text-secondary, #6b7280);
2862
+ white-space: nowrap;
2863
+ }
2864
+
2865
+ .taskon-points-list__primary {
2866
+ font-size: 14px;
2867
+ font-weight: 500;
2868
+ color: var(--taskon-color-text, #1f2937);
2869
+ white-space: nowrap;
2870
+ overflow: hidden;
2871
+ text-overflow: ellipsis;
2872
+ }
2873
+
2874
+ .taskon-points-list__secondary {
2875
+ font-size: 12px;
2876
+ color: var(--taskon-color-text-secondary, #6b7280);
2877
+ white-space: nowrap;
2878
+ overflow: hidden;
2879
+ text-overflow: ellipsis;
2880
+ }
2881
+
2882
+ .taskon-points-list__loading-more {
2883
+ display: flex;
2884
+ justify-content: center;
2885
+ padding: var(--taskon-spacing-md, 16px);
2886
+ }
2887
+
2888
+ .taskon-points-list__table-wrap {
2889
+ margin-top: var(--taskon-spacing-md, 16px);
2890
+ }
2891
+
2892
+ .taskon-points-list__name {
2893
+ font-size: 14px;
2894
+ font-weight: 500;
2895
+ color: var(--taskon-color-text, #1f2937);
2896
+ }
2897
+
2898
+ .taskon-points-list__time {
2899
+ font-size: 13px;
2900
+ color: var(--taskon-color-text-secondary, #6b7280);
2901
+ white-space: nowrap;
2902
+ }
2903
+
2904
+ .taskon-points-list__amount-cell {
2905
+ display: flex;
2906
+ align-items: center;
2907
+ justify-content: flex-end;
2908
+ gap: 6px;
2909
+ }
2910
+
2911
+ .taskon-points-list__amount-icon {
2912
+ width: 20px;
2913
+ height: 20px;
2914
+ border-radius: 50%;
2915
+ flex-shrink: 0;
2916
+ }
2917
+
2918
+ .taskon-points-list__amount-value {
2919
+ font-size: 14px;
2920
+ font-weight: 600;
2921
+ white-space: nowrap;
2922
+ }
2923
+
2924
+ .taskon-points-list__amount-value--positive {
2925
+ color: var(--taskon-color-success, #10b981);
2926
+ }
2927
+
2928
+ .taskon-points-list__amount-value--negative {
2929
+ color: var(--taskon-color-error, #ef4444);
2930
+ }
2931
+
2932
+ /* ============================================================================
2933
+ Identity 组件样式
2934
+ ============================================================================ */
2935
+
2936
+ .taskon-identity {
2937
+ display: flex;
2938
+ flex-direction: column;
2939
+ gap: var(--taskon-uc-spacing-3xl, 40px);
2940
+ }
2941
+
2942
+ .taskon-identity-loading {
2943
+ display: flex;
2944
+ justify-content: center;
2945
+ align-items: center;
2946
+ padding: var(--taskon-spacing-xl, 32px);
2947
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
2948
+ }
2949
+
2950
+ .taskon-identity-empty {
2951
+ display: flex;
2952
+ justify-content: center;
2953
+ align-items: center;
2954
+ padding: var(--taskon-spacing-xl, 32px);
2955
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
2956
+ font-size: 14px;
2957
+ }
2958
+
2959
+ /* ============================================================================
2960
+ Social Media Accounts - 基于 Figma 设计
2961
+ https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4024-19730
2962
+ ============================================================================ */
2963
+
2964
+ /* 社交账号区域 */
2965
+ .taskon-identity-social-section {
2966
+ display: flex;
2967
+ flex-direction: column;
2968
+ gap: var(--taskon-uc-spacing-l, 20px);
2969
+ }
2970
+
2971
+ /* 标题: 24px 加粗白色 */
2972
+ .taskon-identity-social-section__title {
2973
+ font-size: 24px;
2974
+ font-weight: 600;
2975
+ line-height: 32px;
2976
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2977
+ margin: 0;
2978
+ }
2979
+
2980
+ /* 网格布局: 每行最多 3 个,间距 20px */
2981
+ .taskon-identity-social-grid {
2982
+ display: flex;
2983
+ flex-wrap: wrap;
2984
+ gap: var(--taskon-uc-spacing-l, 20px);
2985
+ }
2986
+
2987
+ /* 社交账号卡片: 305px × 64px */
2988
+ .taskon-identity-social-item {
2989
+ display: flex;
2990
+ align-items: center;
2991
+ justify-content: space-between;
2992
+ gap: var(--taskon-uc-spacing-l, 20px);
2993
+ width: 305px;
2994
+ height: 64px;
2995
+ padding: var(--taskon-uc-spacing-m, 16px);
2996
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
2997
+ border-radius: 10px;
2998
+ box-sizing: border-box;
2999
+ transition: background-color 0.2s ease;
3000
+ }
3001
+
3002
+ .taskon-identity-social-item:hover {
3003
+ background-color: rgba(255, 255, 255, 0.08);
3004
+ }
3005
+
3006
+ /* 已绑定状态 - 可以添加不同的视觉反馈 */
3007
+ .taskon-identity-social-item--bound {
3008
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
3009
+ }
3010
+
3011
+ /* 卡片左侧内容区域 */
3012
+ .taskon-identity-social-item__content {
3013
+ display: flex;
3014
+ align-items: center;
3015
+ gap: var(--taskon-uc-spacing-s, 12px);
3016
+ flex: 1;
3017
+ min-width: 0;
3018
+ }
3019
+
3020
+ /* 图标容器: 24x24 */
3021
+ .taskon-identity-social-item__icon {
3022
+ display: flex;
3023
+ align-items: center;
3024
+ justify-content: center;
3025
+ width: 24px;
3026
+ height: 24px;
3027
+ flex-shrink: 0;
3028
+ }
3029
+
3030
+ .taskon-identity-social-item__icon svg {
3031
+ width: 24px;
3032
+ height: 24px;
3033
+ }
3034
+
3035
+ /* 文字区域 */
3036
+ .taskon-identity-social-item__text {
3037
+ flex: 1;
3038
+ min-width: 0;
3039
+ }
3040
+
3041
+ /* 文字样式: 16px 加粗白色 */
3042
+ .taskon-identity-social-item__name {
3043
+ font-size: 16px;
3044
+ font-weight: 600;
3045
+ line-height: 24px;
3046
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3047
+ white-space: nowrap;
3048
+ overflow: hidden;
3049
+ text-overflow: ellipsis;
3050
+ }
3051
+
3052
+ /* 链接样式 */
3053
+ .taskon-identity-social-item__link {
3054
+ font-size: 16px;
3055
+ font-weight: 600;
3056
+ line-height: 24px;
3057
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3058
+ text-decoration: none;
3059
+ white-space: nowrap;
3060
+ overflow: hidden;
3061
+ text-overflow: ellipsis;
3062
+ display: block;
3063
+ transition: color 0.2s ease;
3064
+ }
3065
+
3066
+ .taskon-identity-social-item__link:hover {
3067
+ color: var(--taskon-uc-color-link, #ffd465);
3068
+ }
3069
+
3070
+ /* 箭头按钮: 34x34 白色背景 */
3071
+ .taskon-identity-social-btn {
3072
+ display: flex;
3073
+ align-items: center;
3074
+ justify-content: center;
3075
+ width: 34px;
3076
+ height: 34px;
3077
+ padding: var(--taskon-uc-spacing-xs, 8px);
3078
+ background-color: var(--taskon-uc-color-text-lightest, #ffffff);
3079
+ border: none;
3080
+ border-radius: var(--taskon-uc-radius-m, 6px);
3081
+ cursor: pointer;
3082
+ flex-shrink: 0;
3083
+ color: #000000;
3084
+ transition: all 0.2s ease;
3085
+ }
3086
+
3087
+ .taskon-identity-social-btn:hover:not(:disabled) {
3088
+ background-color: rgba(255, 255, 255, 0.9);
3089
+ transform: translateX(2px);
3090
+ }
3091
+
3092
+ .taskon-identity-social-btn:disabled {
3093
+ opacity: 0.5;
3094
+ cursor: not-allowed;
3095
+ }
3096
+
3097
+ .taskon-identity-social-btn svg {
3098
+ width: 18px;
3099
+ height: 18px;
3100
+ }
3101
+
3102
+ /* 加载动画 */
3103
+ .taskon-identity-social-btn__spinner {
3104
+ width: 14px;
3105
+ height: 14px;
3106
+ border: 2px solid rgba(0, 0, 0, 0.2);
3107
+ border-top-color: #000000;
3108
+ border-radius: 50%;
3109
+ animation: taskon-spin 1s linear infinite;
3110
+ }
3111
+
3112
+ /* ============================================================================
3113
+ Email Address - 独立模块
3114
+ https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4024-19928
3115
+ ============================================================================ */
3116
+
3117
+ /* Email Address 区域 */
3118
+ .taskon-identity-email-section {
3119
+ display: flex;
3120
+ flex-direction: column;
3121
+ gap: var(--taskon-uc-spacing-l, 20px);
3122
+ }
3123
+
3124
+ /* 标题: 16px 加粗白色 */
3125
+ .taskon-identity-email-section__title {
3126
+ font-size: 16px;
3127
+ font-weight: 600;
3128
+ line-height: 24px;
3129
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3130
+ margin: 0;
3131
+ }
3132
+
3133
+ /* Email 卡片容器 - 单个卡片 */
3134
+ .taskon-identity-email-card {
3135
+ display: flex;
3136
+ }
3137
+
3138
+ /* ============================================================================
3139
+ Network List - 基于 Figma 设计
3140
+ https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4024-19771
3141
+ ============================================================================ */
3142
+
3143
+ /* Network List 区域 */
3144
+ .taskon-network-section {
3145
+ display: flex;
3146
+ flex-direction: column;
3147
+ gap: var(--taskon-uc-spacing-l, 20px);
3148
+ }
3149
+
3150
+ /* 标题: 24px 加粗白色 */
3151
+ .taskon-network-section__title {
3152
+ font-size: 24px;
3153
+ font-weight: 600;
3154
+ line-height: 32px;
3155
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3156
+ margin: 0;
3157
+ }
3158
+
3159
+ /* 网格布局: EVM 全宽,其他链每行 2 个 */
3160
+ .taskon-network-grid {
3161
+ display: grid;
3162
+ grid-template-columns: repeat(2, 1fr);
3163
+ gap: var(--taskon-uc-spacing-l, 20px);
3164
+ max-width: 630px;
3165
+ }
3166
+
3167
+ /* Network Card 基础样式 */
3168
+ .taskon-network-card {
3169
+ position: relative;
3170
+ display: flex;
3171
+ flex-direction: column;
3172
+ gap: var(--taskon-uc-spacing-m, 16px);
3173
+ padding: var(--taskon-uc-spacing-l, 20px);
3174
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
3175
+ border-radius: 12px;
3176
+ box-sizing: border-box;
3177
+ }
3178
+
3179
+ /* EVM 多地址卡片: 全宽 */
3180
+ .taskon-network-card--multi {
3181
+ grid-column: 1 / -1;
3182
+ }
3183
+
3184
+ /* 单链卡片 */
3185
+ .taskon-network-card--single {
3186
+ min-height: 140px;
3187
+ }
3188
+
3189
+ /* 卡片头部 */
3190
+ .taskon-network-card__header {
3191
+ display: flex;
3192
+ align-items: center;
3193
+ }
3194
+
3195
+ /* 链标签: 14px medium 白色 */
3196
+ .taskon-network-card__label {
3197
+ font-size: 14px;
3198
+ font-weight: 500;
3199
+ line-height: 20px;
3200
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3201
+ }
3202
+
3203
+ /* 链图标容器 */
3204
+ .taskon-network-card__chain-icon {
3205
+ display: flex;
3206
+ gap: var(--taskon-uc-spacing-xs, 8px);
3207
+ }
3208
+
3209
+ .taskon-network-card__chain-icon svg {
3210
+ width: 24px;
3211
+ height: 24px;
3212
+ border-radius: 8px;
3213
+ }
3214
+
3215
+ /* EVM 多链图标行 */
3216
+ .taskon-network-chain-icons {
3217
+ display: flex;
3218
+ flex-wrap: wrap;
3219
+ gap: var(--taskon-uc-spacing-xs, 8px);
3220
+ align-items: center;
3221
+ }
3222
+
3223
+ .taskon-network-chain-icons svg {
3224
+ width: 24px;
3225
+ height: 24px;
3226
+ border-radius: 8px;
3227
+ flex-shrink: 0;
3228
+ }
3229
+
3230
+ .taskon-network-chain-icons__more {
3231
+ display: flex;
3232
+ align-items: center;
3233
+ justify-content: center;
3234
+ width: 24px;
3235
+ height: 24px;
3236
+ background-color: #f2f4f5;
3237
+ border-radius: 8px;
3238
+ }
3239
+
3240
+ /* 地址列表容器 */
3241
+ .taskon-network-card__addresses {
3242
+ display: flex;
3243
+ flex-direction: column;
3244
+ gap: var(--taskon-uc-spacing-s, 12px);
3245
+ }
3246
+
3247
+ /* 地址行 */
3248
+ .taskon-network-address-row {
3249
+ display: flex;
3250
+ align-items: center;
3251
+ gap: var(--taskon-uc-spacing-l, 20px);
3252
+ height: 40px;
3253
+ padding: 0 var(--taskon-uc-spacing-m, 16px);
3254
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
3255
+ border-radius: var(--taskon-uc-radius-m, 6px);
3256
+ backdrop-filter: blur(10px);
3257
+ }
3258
+
3259
+ .taskon-network-address-row__left {
3260
+ display: flex;
3261
+ align-items: center;
3262
+ gap: var(--taskon-uc-spacing-xs, 8px);
3263
+ flex: 1;
3264
+ }
3265
+
3266
+ .taskon-network-address-row__addr {
3267
+ font-size: 14px;
3268
+ font-weight: 500;
3269
+ line-height: 20px;
3270
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3271
+ }
3272
+
3273
+ .taskon-network-address-row__addr--secondary {
3274
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
3275
+ }
3276
+
3277
+ .taskon-network-address-row__divider {
3278
+ width: 1px;
3279
+ height: 15px;
3280
+ background-color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
3281
+ opacity: 0.1;
3282
+ }
3283
+
3284
+ .taskon-network-address-row__right {
3285
+ display: flex;
3286
+ align-items: center;
3287
+ gap: var(--taskon-uc-spacing-xs, 8px);
3288
+ min-width: 142px;
3289
+ justify-content: flex-end;
3290
+ }
3291
+
3292
+ .taskon-network-address-row__type {
3293
+ font-size: 14px;
3294
+ font-weight: 400;
3295
+ line-height: normal;
3296
+ text-transform: capitalize;
3297
+ }
3298
+
3299
+ .taskon-network-address-row__type--primary {
3300
+ color: #1affab;
3301
+ }
3302
+
3303
+ .taskon-network-address-row__type--secondary {
3304
+ color: rgba(203, 255, 1, 0.4);
3305
+ }
3306
+
3307
+ .taskon-network-address-row__edit {
3308
+ width: 14px;
3309
+ height: 14px;
3310
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
3311
+ cursor: pointer;
3312
+ }
3313
+
3314
+ /* 复制按钮 */
3315
+ .taskon-network-copy-btn {
3316
+ display: flex;
3317
+ align-items: center;
3318
+ justify-content: center;
3319
+ padding: 0;
3320
+ background: none;
3321
+ border: none;
3322
+ cursor: pointer;
3323
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3324
+ transition: color 0.2s ease;
3325
+ }
3326
+
3327
+ .taskon-network-copy-btn:hover {
3328
+ color: var(--taskon-uc-color-link, #ffd465);
3329
+ }
3330
+
3331
+ /* Unbind 徽章按钮 */
3332
+ .taskon-network-unbind-badge {
3333
+ display: flex;
3334
+ align-items: center;
3335
+ justify-content: center;
3336
+ height: 20px;
3337
+ padding: 0 var(--taskon-uc-spacing-xs, 8px);
3338
+ font-size: 11px;
3339
+ font-weight: 600;
3340
+ line-height: 12px;
3341
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3342
+ background-color: var(--taskon-uc-color-text-darkest, rgba(255, 255, 255, 0.1));
3343
+ border: none;
3344
+ border-radius: 4px;
3345
+ cursor: pointer;
3346
+ transition: all 0.2s ease;
3347
+ flex-shrink: 0;
3348
+ }
3349
+
3350
+ .taskon-network-unbind-badge:hover:not(:disabled) {
3351
+ background-color: rgba(255, 255, 255, 0.2);
3352
+ }
3353
+
3354
+ .taskon-network-unbind-badge:disabled {
3355
+ opacity: 0.5;
3356
+ cursor: not-allowed;
3357
+ }
3358
+
3359
+ /* 右上角的 Unbind 按钮(单链卡片) */
3360
+ .taskon-network-unbind-badge--corner {
3361
+ position: absolute;
3362
+ top: 8px;
3363
+ right: 9px;
3364
+ }
3365
+
3366
+ /* 地址输入框样式(单链卡片) */
3367
+ .taskon-network-address-input {
3368
+ display: flex;
3369
+ align-items: center;
3370
+ justify-content: space-between;
3371
+ height: 34px;
3372
+ padding: 0 var(--taskon-uc-spacing-m, 16px);
3373
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
3374
+ border-radius: var(--taskon-uc-radius-m, 6px);
3375
+ backdrop-filter: blur(10px);
3376
+ }
3377
+
3378
+ .taskon-network-address-input__text {
3379
+ font-size: 14px;
3380
+ font-weight: 500;
3381
+ line-height: 20px;
3382
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3383
+ }
3384
+
3385
+ /* Connect Wallet 按钮 */
3386
+ .taskon-network-connect-btn {
3387
+ display: flex;
3388
+ align-items: center;
3389
+ justify-content: center;
3390
+ height: 34px;
3391
+ padding: var(--taskon-uc-spacing-xs, 8px) var(--taskon-uc-spacing-s, 12px);
3392
+ font-size: 14px;
3393
+ font-weight: 500;
3394
+ line-height: 20px;
3395
+ color: #000000;
3396
+ background-color: var(--taskon-uc-color-text-lightest, #ffffff);
3397
+ border: none;
3398
+ border-radius: var(--taskon-uc-radius-m, 6px);
3399
+ cursor: pointer;
3400
+ transition: all 0.2s ease;
3401
+ }
3402
+
3403
+ .taskon-network-connect-btn:hover:not(:disabled) {
3404
+ background-color: rgba(255, 255, 255, 0.9);
3405
+ }
3406
+
3407
+ .taskon-network-connect-btn:disabled {
3408
+ opacity: 0.5;
3409
+ cursor: not-allowed;
3410
+ }
3411
+
3412
+ /* ============================================================================
3413
+ Network List 响应式适配
3414
+ ============================================================================ */
3415
+
3416
+ @media (max-width: 750px) {
3417
+ .taskon-network-section__title {
3418
+ font-size: 20px;
3419
+ line-height: 28px;
3420
+ }
3421
+
3422
+ .taskon-network-grid {
3423
+ grid-template-columns: 1fr;
3424
+ max-width: 100%;
3425
+ }
3426
+
3427
+ .taskon-network-card {
3428
+ padding: var(--taskon-uc-spacing-m, 16px);
3429
+ }
3430
+
3431
+ .taskon-network-address-row {
3432
+ flex-wrap: wrap;
3433
+ height: auto;
3434
+ padding: var(--taskon-uc-spacing-xs, 8px) var(--taskon-uc-spacing-s, 12px);
3435
+ gap: var(--taskon-uc-spacing-xs, 8px);
3436
+ }
3437
+
3438
+ .taskon-network-address-row__left {
3439
+ width: 100%;
3440
+ }
3441
+
3442
+ .taskon-network-address-row__divider {
3443
+ display: none;
3444
+ }
3445
+
3446
+ .taskon-network-address-row__right {
3447
+ min-width: auto;
3448
+ justify-content: flex-start;
3449
+ }
3450
+
3451
+ .taskon-network-address-row__type {
3452
+ font-size: 12px;
3453
+ }
3454
+ }
3455
+
3456
+ /* ============================================================================
3457
+ Wallet Addresses Section (保留原有样式)
3458
+ ============================================================================ */
3459
+
3460
+ /* Identity Section */
3461
+ .taskon-identity-section {
3462
+ display: flex;
3463
+ flex-direction: column;
3464
+ gap: var(--taskon-uc-spacing-m, 16px);
3465
+ }
3466
+
3467
+ .taskon-identity-section__title {
3468
+ font-size: 16px;
3469
+ font-weight: 600;
3470
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3471
+ margin: 0;
3472
+ }
3473
+
3474
+ /* Identity List */
3475
+ .taskon-identity-list {
3476
+ display: flex;
3477
+ flex-direction: column;
3478
+ gap: var(--taskon-uc-spacing-sm, 8px);
3479
+ }
3480
+
3481
+ /* Identity Item (用于钱包) */
3482
+ .taskon-identity-item {
3483
+ display: flex;
3484
+ align-items: center;
3485
+ gap: var(--taskon-uc-spacing-m, 16px);
3486
+ padding: var(--taskon-uc-spacing-m, 16px);
3487
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
3488
+ border-radius: var(--taskon-uc-radius-l, 8px);
3489
+ transition: all 0.2s ease;
3490
+ }
3491
+
3492
+ .taskon-identity-item:hover {
3493
+ background-color: rgba(255, 255, 255, 0.08);
3494
+ }
3495
+
3496
+ .taskon-identity-item--bound {
3497
+ background-color: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
3498
+ }
3499
+
3500
+ .taskon-identity-item__icon {
3501
+ display: flex;
3502
+ align-items: center;
3503
+ justify-content: center;
3504
+ width: 40px;
3505
+ height: 40px;
3506
+ font-size: 20px;
3507
+ background-color: rgba(255, 255, 255, 0.1);
3508
+ border-radius: var(--taskon-uc-radius-m, 6px);
3509
+ flex-shrink: 0;
3510
+ }
3511
+
3512
+ .taskon-identity-item--bound .taskon-identity-item__icon {
3513
+ background-color: rgba(255, 255, 255, 0.1);
3514
+ }
3515
+
3516
+ .taskon-identity-item__info {
3517
+ flex: 1;
3518
+ display: flex;
3519
+ flex-direction: column;
3520
+ gap: 2px;
3521
+ min-width: 0;
3522
+ }
3523
+
3524
+ .taskon-identity-item__name {
3525
+ font-size: 14px;
3526
+ font-weight: 500;
3527
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
3528
+ }
3529
+
3530
+ .taskon-identity-item__value {
3531
+ display: flex;
3532
+ align-items: center;
3533
+ gap: var(--taskon-uc-spacing-xs, 4px);
3534
+ font-size: 13px;
3535
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
3536
+ }
3537
+
3538
+ .taskon-identity-item__link {
3539
+ color: var(--taskon-uc-color-link, #ffd465);
3540
+ text-decoration: none;
3541
+ transition: color 0.2s ease;
3542
+ }
3543
+
3544
+ .taskon-identity-item__link:hover {
3545
+ text-decoration: underline;
3546
+ }
3547
+
3548
+ .taskon-identity-item__address {
3549
+ font-size: 13px;
3550
+ }
3551
+
3552
+ .taskon-identity-item__badge {
3553
+ display: inline-flex;
3554
+ align-items: center;
3555
+ padding: 2px 6px;
3556
+ font-size: 11px;
3557
+ font-weight: 500;
3558
+ color: var(--taskon-uc-color-link, #ffd465);
3559
+ background-color: rgba(255, 212, 101, 0.15);
3560
+ border-radius: var(--taskon-uc-radius-s, 4px);
3561
+ }
3562
+
3563
+ .taskon-identity-item__action {
3564
+ flex-shrink: 0;
3565
+ }
3566
+
3567
+ /* Identity Button */
3568
+ .taskon-identity-btn {
3569
+ display: inline-flex;
3570
+ align-items: center;
3571
+ justify-content: center;
3572
+ padding: var(--taskon-uc-spacing-xs, 8px) var(--taskon-uc-spacing-m, 16px);
3573
+ font-size: 13px;
3574
+ font-weight: 500;
3575
+ border-radius: var(--taskon-uc-radius-m, 6px);
3576
+ border: none;
3577
+ cursor: pointer;
3578
+ transition: all 0.2s ease;
3579
+ min-width: 72px;
3580
+ height: 32px;
3581
+ }
3582
+
3583
+ .taskon-identity-btn:disabled {
3584
+ opacity: 0.5;
3585
+ cursor: not-allowed;
3586
+ }
3587
+
3588
+ .taskon-identity-btn--bind {
3589
+ background-color: var(--taskon-uc-color-text-lightest, #ffffff);
3590
+ color: #000000;
3591
+ }
3592
+
3593
+ .taskon-identity-btn--bind:hover:not(:disabled) {
3594
+ background-color: rgba(255, 255, 255, 0.9);
3595
+ }
3596
+
3597
+ .taskon-identity-btn--unbind {
3598
+ background: transparent;
3599
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
3600
+ border: 1px solid var(--taskon-uc-color-border-btn, rgba(255, 255, 255, 0.1));
3601
+ }
3602
+
3603
+ .taskon-identity-btn--unbind:hover:not(:disabled) {
3604
+ color: #ef4444;
3605
+ border-color: #ef4444;
3606
+ background-color: rgba(239, 68, 68, 0.1);
3607
+ }
3608
+
3609
+ /* ============================================================================
3610
+ 响应式适配 - Identity
3611
+ ============================================================================ */
3612
+
3613
+ @media (max-width: 1000px) {
3614
+ /* 中等屏幕:每行 2 个 */
3615
+ .taskon-identity-social-item {
3616
+ width: calc(50% - 10px);
3617
+ min-width: 280px;
3618
+ }
3619
+ }
3620
+
3621
+ @media (max-width: 750px) {
3622
+ /* 小屏幕:每行 1 个,全宽 */
3623
+ .taskon-identity-social-section__title {
3624
+ font-size: 20px;
3625
+ line-height: 28px;
3626
+ }
3627
+
3628
+ .taskon-identity-social-item {
3629
+ width: 100%;
3630
+ min-width: auto;
3631
+ }
3632
+
3633
+ .taskon-identity-section__title {
3634
+ font-size: 14px;
3635
+ }
3636
+
3637
+ .taskon-identity-item {
3638
+ padding: var(--taskon-uc-spacing-sm, 8px) var(--taskon-uc-spacing-m, 16px);
3639
+ gap: var(--taskon-uc-spacing-sm, 8px);
3640
+ }
3641
+
3642
+ .taskon-identity-item__icon {
3643
+ width: 32px;
3644
+ height: 32px;
3645
+ font-size: 16px;
3646
+ }
3647
+
3648
+ .taskon-identity-item__name {
3649
+ font-size: 13px;
3650
+ }
3651
+
3652
+ .taskon-identity-item__value {
3653
+ font-size: 12px;
3654
+ }
3655
+
3656
+ .taskon-identity-btn {
3657
+ padding: var(--taskon-uc-spacing-xs, 4px) var(--taskon-uc-spacing-sm, 8px);
3658
+ font-size: 12px;
3659
+ min-width: 60px;
3660
+ height: 28px;
3661
+ }
3662
+ }