@taskon/widget-react 0.0.1-beta.1

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