@taskon/widget-react 0.0.1 → 0.0.2

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