@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
@@ -0,0 +1,4917 @@
1
+ /**
2
+ * ConfirmNoticeDialog styles
3
+ *
4
+ * @description
5
+ * Keep only content-specific layout/typography and rely on Dialog
6
+ * for container surface, radius and body spacing.
7
+ */
8
+
9
+ /*
10
+ * Responsive base styles
11
+ *
12
+ * Keep mobile breakpoints and fallback patterns centralized here.
13
+ * Components should reuse these mixins instead of duplicating query logic.
14
+ */
15
+
16
+ /*
17
+ * Desktop-up mixin:
18
+ * 1) Enable desktop enhancement in wider containers
19
+ * 2) Keep viewport media query as fallback
20
+ */
21
+
22
+ /* ConfirmNotice content root */
23
+
24
+ .taskon-confirm-notice {
25
+ text-align: center;
26
+ }
27
+
28
+ /* Status icon */
29
+
30
+ .taskon-confirm-notice-icon {
31
+ width: 46px;
32
+ height: 46px;
33
+ display: block;
34
+ margin: 0 auto;
35
+ }
36
+
37
+ /* Title */
38
+
39
+ .taskon-confirm-notice-title {
40
+ margin: 20px 0 0;
41
+ font-weight: 600;
42
+ font-size: 22px;
43
+ line-height: 28px;
44
+ color: var(--taskon-color-text);
45
+ white-space: pre-wrap;
46
+ }
47
+
48
+ /* Description */
49
+
50
+ .taskon-confirm-notice-desc {
51
+ margin: 10px 0 0;
52
+ font-size: 16px;
53
+ line-height: 20px;
54
+ color: var(--taskon-color-text-secondary);
55
+ white-space: pre-wrap;
56
+ }
57
+
58
+ /* Action container */
59
+
60
+ .taskon-confirm-notice-buttons {
61
+ margin-top: 20px;
62
+ display: flex;
63
+ flex-direction: column;
64
+ align-items: stretch;
65
+ justify-content: center;
66
+ gap: 10px;
67
+ }
68
+
69
+ .taskon-confirm-notice-buttons--col {
70
+ flex-wrap: wrap;
71
+ }
72
+
73
+ /* Base action button style */
74
+
75
+ .taskon-confirm-notice-button {
76
+ width: 100%;
77
+ min-width: 100%;
78
+ height: 36px;
79
+ padding: 0 16px;
80
+ border-radius: 8px;
81
+ border: 1px solid transparent;
82
+ font-size: 14px;
83
+ font-weight: 600;
84
+ line-height: 36px;
85
+ text-align: center;
86
+ cursor: pointer;
87
+ transition: all 0.2s ease;
88
+ }
89
+
90
+ .taskon-confirm-notice-button:disabled {
91
+ opacity: 0.5;
92
+ cursor: not-allowed;
93
+ }
94
+
95
+ /* Cancel button */
96
+
97
+ .taskon-confirm-notice-button--cancel {
98
+ color: var(--taskon-color-text);
99
+ background: var(--taskon-color-bg-surface-subtle);
100
+ border-color: var(--taskon-color-border);
101
+ }
102
+
103
+ .taskon-confirm-notice-button--cancel:hover:not(:disabled),
104
+ .taskon-confirm-notice-button--cancel:focus-visible:not(:disabled) {
105
+ background: var(--taskon-color-bg-surface);
106
+ }
107
+
108
+ /* Confirm button */
109
+
110
+ .taskon-confirm-notice-button--confirm {
111
+ color: var(--taskon-color-text-on-primary);
112
+ background: var(--taskon-color-primary);
113
+ }
114
+
115
+ .taskon-confirm-notice-button--confirm:hover:not(:disabled),
116
+ .taskon-confirm-notice-button--confirm:focus-visible:not(:disabled) {
117
+ background: var(--taskon-color-primary-hover);
118
+ }
119
+
120
+ /* Desktop 增强 */
121
+
122
+ @supports (container-type: inline-size) {
123
+ @container (min-width: 751px) {
124
+ .taskon-confirm-notice-buttons {
125
+ flex-direction: row;
126
+ align-items: center;
127
+ }
128
+
129
+ .taskon-confirm-notice-button {
130
+ width: auto;
131
+ min-width: 161px;
132
+ }
133
+ }
134
+ }
135
+
136
+ @supports not (container-type: inline-size) {
137
+ @media (min-width: 751px) {
138
+ .taskon-confirm-notice-buttons {
139
+ flex-direction: row;
140
+ align-items: center;
141
+ }
142
+
143
+ .taskon-confirm-notice-button {
144
+ width: auto;
145
+ min-width: 161px;
146
+ }
147
+ }
148
+ }
149
+ /**
150
+ * Input 通用组件样式
151
+ * @description 复刻 Vue 版本 BaseInputPro.vue 样式
152
+ * 使用 taskon-input 命名空间
153
+ */
154
+
155
+ /* ==================== 输入框 ==================== */
156
+
157
+ .taskon-input {
158
+ width: 100%;
159
+ height: 40px;
160
+ padding: 0 12px;
161
+ border-radius: 6px;
162
+ border: 1px solid var(--taskon-color-border);
163
+ background: var(--taskon-color-bg-surface-subtle);
164
+ color: var(--taskon-color-text);
165
+ font-size: 14px;
166
+ line-height: 40px;
167
+ letter-spacing: 0.04em;
168
+ outline: none;
169
+ transition: border-color 0.2s;
170
+ }
171
+
172
+ .taskon-input:focus {
173
+ border-color: var(--taskon-color-primary);
174
+ }
175
+
176
+ .taskon-input:disabled {
177
+ opacity: 0.6;
178
+ cursor: not-allowed;
179
+ }
180
+
181
+ .taskon-input--error {
182
+ border-color: var(--taskon-color-error);
183
+ }
184
+
185
+ .taskon-input::placeholder {
186
+ color: var(--taskon-color-text-tertiary);
187
+ font-weight: 400;
188
+ }
189
+
190
+ /* ==================== 包装器(用于 rightSlot 和 error) ==================== */
191
+
192
+ .taskon-input-wrapper {
193
+ width: 100%;
194
+ }
195
+
196
+ /* ==================== 容器(包含输入框和右侧插槽) ==================== */
197
+
198
+ .taskon-input-container {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 8px;
202
+ padding-right: 12px;
203
+ border-radius: 6px;
204
+ border: 1px solid var(--taskon-color-border);
205
+ background: var(--taskon-color-bg-surface-subtle);
206
+ transition: border-color 0.2s;
207
+ }
208
+
209
+ .taskon-input-container:focus-within {
210
+ border-color: var(--taskon-color-primary);
211
+ }
212
+
213
+ .taskon-input-container--error {
214
+ border-color: var(--taskon-color-error);
215
+ }
216
+
217
+ /* 容器内的输入框样式重置 */
218
+
219
+ .taskon-input--in-container {
220
+ flex: 1;
221
+ border: none;
222
+ background: transparent;
223
+ border-radius: 0;
224
+ }
225
+
226
+ .taskon-input--in-container:focus {
227
+ border-color: transparent;
228
+ }
229
+
230
+ /* ==================== 右侧插槽 ==================== */
231
+
232
+ .taskon-input-slot {
233
+ flex-shrink: 0;
234
+ display: flex;
235
+ align-items: center;
236
+ }
237
+
238
+ /* MAX 按钮样式(通用样式) */
239
+
240
+ .taskon-input-slot button {
241
+ padding: 4px 8px;
242
+ font-size: 12px;
243
+ font-weight: 600;
244
+ color: var(--taskon-color-primary);
245
+ background: transparent;
246
+ border: 1px solid var(--taskon-color-primary);
247
+ border-radius: 4px;
248
+ cursor: pointer;
249
+ transition: all 0.2s;
250
+ }
251
+
252
+ .taskon-input-slot button:hover:not(:disabled) {
253
+ background: var(--taskon-color-primary-bg);
254
+ }
255
+
256
+ .taskon-input-slot button:disabled {
257
+ opacity: 0.5;
258
+ cursor: not-allowed;
259
+ }
260
+
261
+ /* ==================== 错误信息 ==================== */
262
+
263
+ .taskon-input-error {
264
+ margin: 4px 0 0 0;
265
+ font-size: 12px;
266
+ color: var(--taskon-color-error);
267
+ line-height: 1.4;
268
+ overflow-wrap: anywhere;
269
+ word-break: break-word;
270
+ }
271
+ /**
272
+ * TipPopover 组件样式
273
+ * 设计原则:组件内部不包含 margin,需要间距由外部控制
274
+ */
275
+
276
+ /*
277
+ * Responsive base styles
278
+ *
279
+ * Keep mobile breakpoints and fallback patterns centralized here.
280
+ * Components should reuse these mixins instead of duplicating query logic.
281
+ */
282
+
283
+ /*
284
+ * Desktop-up mixin:
285
+ * 1) Enable desktop enhancement in wider containers
286
+ * 2) Keep viewport media query as fallback
287
+ */
288
+
289
+ .taskon-tip-popover-trigger {
290
+ display: inline-flex;
291
+ align-items: center;
292
+ justify-content: center;
293
+ padding: 0;
294
+ border: none;
295
+ background: transparent;
296
+ cursor: pointer;
297
+ color: var(--taskon-color-text-tertiary);
298
+ outline: none;
299
+ }
300
+
301
+ .taskon-tip-popover-trigger:hover,
302
+ .taskon-tip-popover-trigger:focus {
303
+ color: var(--taskon-color-text-tertiary);
304
+ background: transparent;
305
+ outline: none;
306
+ }
307
+
308
+ /* Custom children trigger - reset button styles */
309
+
310
+ .taskon-tip-popover-trigger--custom {
311
+ cursor: pointer;
312
+ }
313
+
314
+ .taskon-tip-popover-content {
315
+ max-width: 60vw;
316
+ padding: 12px 16px;
317
+ border-radius: var(--taskon-border-radius-sm);
318
+ border: none;
319
+ outline: none;
320
+ background: var(--taskon-color-bg-floating);
321
+ color: var(--taskon-color-text);
322
+ font-size: 13px;
323
+ line-height: 1.5;
324
+ box-shadow: 0 4px 16px var(--taskon-color-bg-mask);
325
+ /* z-index 需要大于 Dialog (9999) 才能在弹窗中正常显示 */
326
+ z-index: 10000;
327
+ animation: taskon-tip-popover-fade-in 0.15s ease;
328
+ }
329
+
330
+ .taskon-tip-popover-content:focus {
331
+ outline: none;
332
+ }
333
+
334
+ .taskon-tip-popover-arrow {
335
+ fill: var(--taskon-color-bg-floating);
336
+ }
337
+
338
+ @keyframes taskon-tip-popover-fade-in {
339
+ from {
340
+ opacity: 0;
341
+ transform: scale(0.96);
342
+ }
343
+ to {
344
+ opacity: 1;
345
+ transform: scale(1);
346
+ }
347
+ }
348
+
349
+ /* Desktop 增强 */
350
+
351
+ @supports (container-type: inline-size) {
352
+ @container (min-width: 751px) {
353
+ .taskon-tip-popover-content {
354
+ max-width: 266px;
355
+ }
356
+ }
357
+ }
358
+
359
+ @supports not (container-type: inline-size) {
360
+ @media (min-width: 751px) {
361
+ .taskon-tip-popover-content {
362
+ max-width: 266px;
363
+ }
364
+ }
365
+ }
366
+ /**
367
+ * Select 组件样式
368
+ *
369
+ * 基于 Vue ProSelect 组件样式翻译
370
+ * 使用 taskon-select 命名空间避免样式冲突。
371
+ *
372
+ * 主题规范:
373
+ * - 不再定义组件私有主题变量
374
+ * - 统一使用 ThemeProvider 输出的通用 --taskon-* 变量
375
+ */
376
+ /*
377
+ * Responsive base styles
378
+ *
379
+ * Keep mobile breakpoints and fallback patterns centralized here.
380
+ * Components should reuse these mixins instead of duplicating query logic.
381
+ */
382
+ /*
383
+ * Desktop-up mixin:
384
+ * 1) Enable desktop enhancement in wider containers
385
+ * 2) Keep viewport media query as fallback
386
+ */
387
+ /* ========== 根容器 ========== */
388
+ .taskon-select {
389
+ position: relative;
390
+ display: inline-block;
391
+ width: 100%;
392
+ }
393
+ /* ========== 禁用状态 ========== */
394
+ .taskon-select--disabled {
395
+ opacity: 0.6;
396
+ cursor: not-allowed;
397
+ }
398
+ /* ========== 触发器 ========== */
399
+ .taskon-select__trigger {
400
+ display: flex;
401
+ align-items: center;
402
+ height: 40px;
403
+ min-width: 120px;
404
+ padding: 0 12px;
405
+ background: var(--taskon-color-bg-surface-subtle);
406
+ color: var(--taskon-color-text);
407
+ font-size: 13px;
408
+ line-height: 20px;
409
+ border: 1px solid var(--taskon-color-border);
410
+ border-radius: var(--taskon-border-radius-sm);
411
+ cursor: pointer;
412
+ transition:
413
+ background 0.2s,
414
+ border-color 0.2s;
415
+ outline: none;
416
+ user-select: none;
417
+ }
418
+ .taskon-select__trigger:hover:not(.taskon-select__trigger--disabled) {
419
+ background: var(--taskon-color-bg-surface);
420
+ border-color: var(--taskon-color-border-secondary);
421
+ }
422
+ .taskon-select__trigger:focus:not(.taskon-select__trigger--disabled) {
423
+ background: var(--taskon-color-bg-surface);
424
+ border-color: var(--taskon-color-border-secondary);
425
+ }
426
+ .taskon-select__trigger--open {
427
+ background: var(--taskon-color-bg-surface);
428
+ border-color: var(--taskon-color-border-secondary);
429
+ }
430
+ .taskon-select__trigger--disabled {
431
+ cursor: not-allowed;
432
+ opacity: 0.6;
433
+ }
434
+ .taskon-select__trigger--error {
435
+ border-color: var(--taskon-color-error) !important;
436
+ }
437
+ /* 深色主题 */
438
+ .taskon-select__trigger--dark {
439
+ background: var(--taskon-color-bg-surface);
440
+ }
441
+ /* 浅色主题 */
442
+ .taskon-select__trigger--light {
443
+ background: var(--taskon-color-bg-surface);
444
+ color: var(--taskon-color-text);
445
+ border-color: var(--taskon-color-border);
446
+ }
447
+ .taskon-select__trigger--light:hover:not(.taskon-select__trigger--disabled) {
448
+ background: var(--taskon-color-bg-surface-strong);
449
+ border-color: var(--taskon-color-border-secondary);
450
+ }
451
+ .taskon-select__trigger--light:focus:not(.taskon-select__trigger--disabled),
452
+ .taskon-select__trigger--light.taskon-select__trigger--open {
453
+ background: var(--taskon-color-bg-surface-strong);
454
+ border-color: var(--taskon-color-border-secondary);
455
+ }
456
+ /* 卡片主题 */
457
+ .taskon-select__trigger--card {
458
+ background: transparent;
459
+ border: none;
460
+ }
461
+ .taskon-select__trigger--card:hover:not(.taskon-select__trigger--disabled),
462
+ .taskon-select__trigger--card:focus:not(.taskon-select__trigger--disabled),
463
+ .taskon-select__trigger--card.taskon-select__trigger--open {
464
+ background: var(--taskon-color-bg-surface-subtle);
465
+ border: none;
466
+ }
467
+ /* ========== 触发器图标 ========== */
468
+ .taskon-select__trigger-icon {
469
+ width: 16px;
470
+ height: 16px;
471
+ border-radius: 50%;
472
+ margin-right: 8px;
473
+ flex-shrink: 0;
474
+ }
475
+ /* ========== 触发器文本 ========== */
476
+ .taskon-select__trigger-text {
477
+ flex: 1;
478
+ overflow: hidden;
479
+ text-overflow: ellipsis;
480
+ white-space: nowrap;
481
+ text-align: left;
482
+ }
483
+ /* ========== 触发器占位符 ========== */
484
+ .taskon-select__trigger-placeholder {
485
+ flex: 1;
486
+ color: var(--taskon-color-text-secondary);
487
+ text-align: left;
488
+ }
489
+ /* ========== 展开图标 ========== */
490
+ .taskon-select__unfold-icon {
491
+ margin-left: 8px;
492
+ color: currentColor;
493
+ opacity: 0.6;
494
+ transition: transform 0.2s;
495
+ flex-shrink: 0;
496
+ }
497
+ .taskon-select__unfold-icon--rotated {
498
+ transform: rotate(180deg);
499
+ }
500
+ /* ========== 下拉菜单 ========== */
501
+ .taskon-select__menu {
502
+ position: absolute;
503
+ top: 100%;
504
+ left: 0;
505
+ right: 0;
506
+ margin-top: 4px;
507
+ background: var(--taskon-color-bg-floating);
508
+ border: 1px solid var(--taskon-color-border);
509
+ border-radius: var(--taskon-border-radius-sm);
510
+ overflow: auto;
511
+ z-index: 9999;
512
+ }
513
+ /* 深色主题 */
514
+ .taskon-select__menu--dark {
515
+ background: var(--taskon-color-bg-floating);
516
+ }
517
+ /* 浅色主题 */
518
+ .taskon-select__menu--light {
519
+ background: var(--taskon-color-bg-floating);
520
+ border-color: var(--taskon-color-border);
521
+ }
522
+ /* ========== 选项 ========== */
523
+ .taskon-select__option {
524
+ display: flex;
525
+ align-items: center;
526
+ padding: 12px 16px;
527
+ color: var(--taskon-color-text);
528
+ cursor: pointer;
529
+ transition: background 0.15s;
530
+ }
531
+ .taskon-select__option:hover:not(.taskon-select__option--disabled) {
532
+ background: var(--taskon-color-bg-surface);
533
+ }
534
+ .taskon-select__option--active {
535
+ background: var(--taskon-color-bg-surface-subtle);
536
+ }
537
+ .taskon-select__option--disabled {
538
+ cursor: not-allowed;
539
+ opacity: 0.4;
540
+ }
541
+ .taskon-select__option--danger .taskon-select__option-label {
542
+ color: var(--taskon-color-error);
543
+ }
544
+ /* ========== 选项图标 ========== */
545
+ .taskon-select__option-icon {
546
+ width: 16px;
547
+ height: 16px;
548
+ border-radius: 50%;
549
+ margin-right: 8px;
550
+ flex-shrink: 0;
551
+ }
552
+ /* ========== 选项内容 ========== */
553
+ .taskon-select__option-content {
554
+ flex: 1;
555
+ min-width: 0;
556
+ }
557
+ /* ========== 选项标签 ========== */
558
+ .taskon-select__option-label {
559
+ font-weight: 500;
560
+ font-size: 14px;
561
+ line-height: 20px;
562
+ overflow: hidden;
563
+ white-space: nowrap;
564
+ text-overflow: ellipsis;
565
+ }
566
+ /* ========== 选项描述 ========== */
567
+ .taskon-select__option-desc {
568
+ font-size: 12px;
569
+ line-height: 16px;
570
+ color: var(--taskon-color-text-secondary);
571
+ margin-top: 2px;
572
+ }
573
+ .taskon-select__menu--light .taskon-select__option {
574
+ color: var(--taskon-color-text);
575
+ }
576
+ .taskon-select__menu--light .taskon-select__option:hover:not(.taskon-select__option--disabled) {
577
+ background: var(--taskon-color-bg-surface);
578
+ }
579
+ .taskon-select__menu--light .taskon-select__option--active {
580
+ background: var(--taskon-color-bg-surface-strong);
581
+ }
582
+ .taskon-select__menu--light .taskon-select__option-desc {
583
+ color: var(--taskon-color-text-secondary);
584
+ }
585
+ /* ========== 选中勾选图标 ========== */
586
+ .taskon-select__option-check {
587
+ margin-left: 8px;
588
+ color: var(--taskon-color-success);
589
+ flex-shrink: 0;
590
+ }
591
+ /* ========== 空状态 ========== */
592
+ .taskon-select__empty {
593
+ padding: 20px;
594
+ text-align: center;
595
+ color: var(--taskon-color-text-secondary);
596
+ font-size: 14px;
597
+ }
598
+ /* ========== 错误信息 ========== */
599
+ .taskon-select__error {
600
+ margin-top: 4px;
601
+ font-size: 12px;
602
+ color: var(--taskon-color-error);
603
+ overflow-wrap: anywhere;
604
+ word-break: break-word;
605
+ }
606
+ @supports (container-type: inline-size) {
607
+ @container (min-width: 751px) {
608
+ .taskon-select__trigger {
609
+ height: 44px;
610
+ font-size: var(--taskon-font-size);
611
+ }
612
+
613
+ .taskon-select__option {
614
+ padding: 15px 20px;
615
+ }
616
+
617
+ .taskon-select__trigger-icon {
618
+ width: 20px;
619
+ height: 20px;
620
+ margin-right: 10px;
621
+ }
622
+
623
+ .taskon-select__option-icon {
624
+ width: 20px;
625
+ height: 20px;
626
+ margin-right: 10px;
627
+ }
628
+
629
+ .taskon-select__unfold-icon {
630
+ margin-left: 10px;
631
+ }
632
+ }
633
+ }
634
+ @supports not (container-type: inline-size) {
635
+ @media (min-width: 751px) {
636
+ .taskon-select__trigger {
637
+ height: 44px;
638
+ font-size: var(--taskon-font-size);
639
+ }
640
+
641
+ .taskon-select__option {
642
+ padding: 15px 20px;
643
+ }
644
+
645
+ .taskon-select__trigger-icon {
646
+ width: 20px;
647
+ height: 20px;
648
+ margin-right: 10px;
649
+ }
650
+
651
+ .taskon-select__option-icon {
652
+ width: 20px;
653
+ height: 20px;
654
+ margin-right: 10px;
655
+ }
656
+
657
+ .taskon-select__unfold-icon {
658
+ margin-left: 10px;
659
+ }
660
+ }
661
+ }
662
+ /**
663
+ * WithdrawSelectOption 组件样式
664
+ *
665
+ * 基于 Vue WithdrawSelectOption 组件样式翻译
666
+ * 主题规范:仅使用通用 --taskon-* 变量,不定义局部主题变量
667
+ */
668
+ /*
669
+ * Responsive base styles
670
+ *
671
+ * Keep mobile breakpoints and fallback patterns centralized here.
672
+ * Components should reuse these mixins instead of duplicating query logic.
673
+ */
674
+ /*
675
+ * Desktop-up mixin:
676
+ * 1) Enable desktop enhancement in wider containers
677
+ * 2) Keep viewport media query as fallback
678
+ */
679
+ .taskon-withdraw-option {
680
+ padding: 12px 4px 12px 16px;
681
+ cursor: pointer;
682
+ }
683
+ .taskon-withdraw-option:hover {
684
+ background: var(--taskon-color-bg-surface);
685
+ }
686
+ /* 禁用状态 */
687
+ .taskon-withdraw-option--disabled {
688
+ cursor: not-allowed;
689
+ opacity: 0.4;
690
+ }
691
+ /* ========== 主要内容 ========== */
692
+ .taskon-withdraw-option__content {
693
+ display: flex;
694
+ align-items: center;
695
+ }
696
+ /* 模糊状态(不可提现) */
697
+ .taskon-withdraw-option__content--blurred {
698
+ pointer-events: none;
699
+ opacity: 0.4;
700
+ }
701
+ /* ========== 链信息 ========== */
702
+ .taskon-withdraw-option__chain {
703
+ display: inline-flex;
704
+ align-items: center;
705
+ gap: 8px;
706
+ width: 33.33%;
707
+ min-width: 0;
708
+ }
709
+ .taskon-withdraw-option__chain-icon {
710
+ width: 14px;
711
+ height: 14px;
712
+ border-radius: 50%;
713
+ flex-shrink: 0;
714
+ }
715
+ .taskon-withdraw-option__chain-label {
716
+ font-size: 13px;
717
+ color: var(--taskon-color-text-secondary);
718
+ overflow: hidden;
719
+ text-overflow: ellipsis;
720
+ white-space: nowrap;
721
+ }
722
+ /* ========== Token 信息 ========== */
723
+ .taskon-withdraw-option__token {
724
+ display: flex;
725
+ align-items: center;
726
+ flex: 1;
727
+ min-width: 0;
728
+ }
729
+ .taskon-withdraw-option__token-icon {
730
+ width: 14px;
731
+ height: 14px;
732
+ border-radius: 50%;
733
+ margin-right: 6px;
734
+ flex-shrink: 0;
735
+ }
736
+ .taskon-withdraw-option__token-label {
737
+ font-weight: 500;
738
+ font-size: 13px;
739
+ line-height: 20px;
740
+ color: var(--taskon-color-text);
741
+ overflow: hidden;
742
+ white-space: nowrap;
743
+ text-overflow: ellipsis;
744
+ }
745
+ /* ========== 尾部信息(余额 + 选中状态) ========== */
746
+ .taskon-withdraw-option__trailing {
747
+ display: flex;
748
+ align-items: center;
749
+ justify-content: flex-end;
750
+ gap: 4px;
751
+ flex-shrink: 0;
752
+ }
753
+ .taskon-withdraw-option__balance {
754
+ font-size: 13px;
755
+ color: var(--taskon-color-text-tertiary);
756
+ }
757
+ .taskon-withdraw-option__check {
758
+ width: 12px;
759
+ height: 8px;
760
+ color: var(--taskon-color-success);
761
+ visibility: hidden;
762
+ }
763
+ .taskon-withdraw-option__check--visible {
764
+ visibility: visible;
765
+ }
766
+ /* ========== 警告提示 ========== */
767
+ .taskon-withdraw-option__warning {
768
+ margin-top: 4px;
769
+ font-size: 11px;
770
+ font-weight: 400;
771
+ color: var(--taskon-color-warning);
772
+ }
773
+ @supports (container-type: inline-size) {
774
+ @container (min-width: 751px) {
775
+ .taskon-withdraw-option {
776
+ padding: 15px 6px 15px 20px;
777
+ }
778
+
779
+ .taskon-withdraw-option__chain-icon,
780
+ .taskon-withdraw-option__token-icon {
781
+ width: 16px;
782
+ height: 16px;
783
+ }
784
+
785
+ .taskon-withdraw-option__chain-label,
786
+ .taskon-withdraw-option__token-label,
787
+ .taskon-withdraw-option__balance {
788
+ font-size: 14px;
789
+ }
790
+
791
+ .taskon-withdraw-option__warning {
792
+ font-size: 12px;
793
+ }
794
+ }
795
+ }
796
+ @supports not (container-type: inline-size) {
797
+ @media (min-width: 751px) {
798
+ .taskon-withdraw-option {
799
+ padding: 15px 6px 15px 20px;
800
+ }
801
+
802
+ .taskon-withdraw-option__chain-icon,
803
+ .taskon-withdraw-option__token-icon {
804
+ width: 16px;
805
+ height: 16px;
806
+ }
807
+
808
+ .taskon-withdraw-option__chain-label,
809
+ .taskon-withdraw-option__token-label,
810
+ .taskon-withdraw-option__balance {
811
+ font-size: 14px;
812
+ }
813
+
814
+ .taskon-withdraw-option__warning {
815
+ font-size: 12px;
816
+ }
817
+ }
818
+ }
819
+ /**
820
+ * FormItem 组件样式
821
+ *
822
+ * 基于 Vue FormItem.vue 样式翻译
823
+ */
824
+ /*
825
+ * Responsive base styles
826
+ *
827
+ * Keep mobile breakpoints and fallback patterns centralized here.
828
+ * Components should reuse these mixins instead of duplicating query logic.
829
+ */
830
+ /*
831
+ * Desktop-up mixin:
832
+ * 1) Enable desktop enhancement in wider containers
833
+ * 2) Keep viewport media query as fallback
834
+ */
835
+ /* ========== 根容器 ========== */
836
+ .taskon-form-item {
837
+ --form-item-space: 12px;
838
+ --form-item-label-space: 6px;
839
+ --form-item-font-size: 13px;
840
+ --form-item-line-height: 20px;
841
+
842
+ position: relative;
843
+ }
844
+ /* 相邻 FormItem 之间的间距 */
845
+ .taskon-form-item + .taskon-form-item {
846
+ margin-top: var(--form-item-space);
847
+ }
848
+ /* Dialog 模式下的间距 */
849
+ .taskon-form-item--dialog + .taskon-form-item--dialog {
850
+ margin-top: 16px;
851
+ }
852
+ /* ========== 标签行 ========== */
853
+ .taskon-form-item__row {
854
+ display: flex;
855
+ align-items: center;
856
+ }
857
+ /* 有标签时的下边距 */
858
+ .taskon-form-item__row--has-label {
859
+ margin-bottom: var(--form-item-label-space);
860
+ }
861
+ /* 无下边距 */
862
+ .taskon-form-item__row--no-margin {
863
+ margin-bottom: 0;
864
+ }
865
+ /* ========== 标签 ========== */
866
+ .taskon-form-item__label {
867
+ display: flex;
868
+ align-items: center;
869
+ font-weight: 500;
870
+ font-size: var(--form-item-font-size);
871
+ line-height: var(--form-item-line-height);
872
+ color: var(--taskon-color-text);
873
+ white-space: nowrap;
874
+ }
875
+ /* ========== 可选标记 ========== */
876
+ .taskon-form-item__optional {
877
+ color: var(--taskon-color-text-disabled);
878
+ }
879
+ /* ========== 提示图标 ========== */
880
+ .taskon-form-item__tip {
881
+ margin-left: 8px;
882
+ display: inline-flex;
883
+ align-items: center;
884
+ }
885
+ /* ========== 文档链接 ========== */
886
+ .taskon-form-item__doc-link {
887
+ margin-left: auto;
888
+ display: flex;
889
+ align-items: center;
890
+ gap: 4px;
891
+ font-size: 14px;
892
+ color: var(--taskon-color-link);
893
+ text-decoration: none;
894
+ cursor: pointer;
895
+ }
896
+ .taskon-form-item__doc-link:hover {
897
+ text-decoration: underline;
898
+ }
899
+ .taskon-form-item__doc-icon {
900
+ width: 8px;
901
+ height: 9px;
902
+ }
903
+ /* ========== 错误信息 ========== */
904
+ .taskon-form-item__error {
905
+ margin-top: 4px;
906
+ font-size: 12px;
907
+ line-height: 16px;
908
+ color: var(--taskon-color-error);
909
+ white-space: pre-wrap;
910
+ overflow-wrap: anywhere;
911
+ word-break: break-word;
912
+ }
913
+ /* 警告样式(橙色) */
914
+ .taskon-form-item__error--warn {
915
+ color: var(--taskon-color-warning);
916
+ }
917
+ @supports (container-type: inline-size) {
918
+ @container (min-width: 751px) {
919
+ .taskon-form-item {
920
+ --form-item-space: 16px;
921
+ --form-item-label-space: 8px;
922
+ --form-item-font-size: 14px;
923
+ }
924
+
925
+ .taskon-form-item--dialog + .taskon-form-item--dialog {
926
+ margin-top: 20px;
927
+ }
928
+
929
+ .taskon-form-item__tip {
930
+ margin-left: 6px;
931
+ }
932
+ }
933
+ }
934
+ @supports not (container-type: inline-size) {
935
+ @media (min-width: 751px) {
936
+ .taskon-form-item {
937
+ --form-item-space: 16px;
938
+ --form-item-label-space: 8px;
939
+ --form-item-font-size: 14px;
940
+ }
941
+
942
+ .taskon-form-item--dialog + .taskon-form-item--dialog {
943
+ margin-top: 20px;
944
+ }
945
+
946
+ .taskon-form-item__tip {
947
+ margin-left: 6px;
948
+ }
949
+ }
950
+ }
951
+ /**
952
+ * Checkbox 复选框组件样式
953
+ *
954
+ * 采用 BEM 命名规范
955
+ * 前缀: taskon-checkbox
956
+ *
957
+ * 参考 Vue 版本 BaseCheckBox.vue 样式实现
958
+ */
959
+ /*
960
+ * Responsive base styles
961
+ *
962
+ * Keep mobile breakpoints and fallback patterns centralized here.
963
+ * Components should reuse these mixins instead of duplicating query logic.
964
+ */
965
+ /*
966
+ * Desktop-up mixin:
967
+ * 1) Enable desktop enhancement in wider containers
968
+ * 2) Keep viewport media query as fallback
969
+ */
970
+ /* ============================================================================
971
+ 根元素
972
+ ============================================================================ */
973
+ .taskon-checkbox {
974
+ display: inline-flex;
975
+ align-items: center;
976
+ justify-content: center;
977
+ cursor: pointer;
978
+ user-select: none;
979
+ outline: none;
980
+ }
981
+ /* 悬停和聚焦效果 */
982
+ .taskon-checkbox:not(.taskon-checkbox--disabled):hover,
983
+ .taskon-checkbox:not(.taskon-checkbox--disabled):focus {
984
+ opacity: 0.8;
985
+ }
986
+ /* 禁用状态 */
987
+ .taskon-checkbox--disabled {
988
+ cursor: not-allowed;
989
+ opacity: 0.4;
990
+ }
991
+ /* 只读状态 */
992
+ .taskon-checkbox--readonly {
993
+ cursor: default;
994
+ opacity: 0.4;
995
+ }
996
+ /* ============================================================================
997
+ 隐藏的原生 input
998
+ ============================================================================ */
999
+ .taskon-checkbox__input {
1000
+ display: none;
1001
+ }
1002
+ /* ============================================================================
1003
+ 自定义图标容器
1004
+ ============================================================================ */
1005
+ .taskon-checkbox__icon {
1006
+ display: flex;
1007
+ justify-content: center;
1008
+ align-items: center;
1009
+ width: 16px;
1010
+ height: 16px;
1011
+ border: 2px solid var(--taskon-color-border);
1012
+ border-radius: 3px;
1013
+ transition: all 0.2s ease;
1014
+ flex-shrink: 0;
1015
+ }
1016
+ /* 选中状态 - 默认绿色背景 */
1017
+ .taskon-checkbox__icon--active {
1018
+ border: 0 none;
1019
+ background-color: var(--taskon-color-secondary);
1020
+ border-radius: 4px;
1021
+ }
1022
+ /* 选中状态显示勾选图标 */
1023
+ .taskon-checkbox__icon--active .taskon-checkbox__icon-checked {
1024
+ display: block;
1025
+ }
1026
+ /* light 类型选中状态 - 浅色背景 */
1027
+ .taskon-checkbox__icon--active.taskon-checkbox__icon--light {
1028
+ border: 1px solid var(--taskon-color-border);
1029
+ background-color: var(--taskon-color-bg-surface);
1030
+ }
1031
+ /* 圆形样式 */
1032
+ .taskon-checkbox__icon--round {
1033
+ border-radius: 50%;
1034
+ }
1035
+ /* ============================================================================
1036
+ 勾选图标 SVG
1037
+ ============================================================================ */
1038
+ .taskon-checkbox__icon-checked {
1039
+ display: none;
1040
+ width: 10px;
1041
+ height: 8px;
1042
+ color: var(--taskon-color-text-on-primary);
1043
+ }
1044
+ .taskon-checkbox__icon--active.taskon-checkbox__icon--light .taskon-checkbox__icon-checked {
1045
+ color: var(--taskon-color-text);
1046
+ }
1047
+ /* ============================================================================
1048
+ 标签文字
1049
+ ============================================================================ */
1050
+ .taskon-checkbox__label {
1051
+ margin-left: 8px;
1052
+ color: var(--taskon-color-text-secondary);
1053
+ font-size: 14px;
1054
+ font-style: normal;
1055
+ font-weight: 500;
1056
+ line-height: 18px;
1057
+ }
1058
+ @supports (container-type: inline-size) {
1059
+ @container (min-width: 751px) {
1060
+ .taskon-checkbox__icon {
1061
+ width: 20px;
1062
+ height: 20px;
1063
+ border-radius: 4px;
1064
+ }
1065
+
1066
+ .taskon-checkbox__icon-checked {
1067
+ width: 12px;
1068
+ height: 10px;
1069
+ }
1070
+
1071
+ .taskon-checkbox__label {
1072
+ font-size: 16px;
1073
+ line-height: 20px;
1074
+ }
1075
+ }
1076
+ }
1077
+ @supports not (container-type: inline-size) {
1078
+ @media (min-width: 751px) {
1079
+ .taskon-checkbox__icon {
1080
+ width: 20px;
1081
+ height: 20px;
1082
+ border-radius: 4px;
1083
+ }
1084
+
1085
+ .taskon-checkbox__icon-checked {
1086
+ width: 12px;
1087
+ height: 10px;
1088
+ }
1089
+
1090
+ .taskon-checkbox__label {
1091
+ font-size: 16px;
1092
+ line-height: 20px;
1093
+ }
1094
+ }
1095
+ }
1096
+ /**
1097
+ * Switch 开关组件样式
1098
+ *
1099
+ * 采用 BEM 命名规范
1100
+ * 前缀: taskon-switch
1101
+ *
1102
+ * 参考 Vue 版本 BaseSwitch.vue 样式实现
1103
+ */
1104
+ /*
1105
+ * Responsive base styles
1106
+ *
1107
+ * Keep mobile breakpoints and fallback patterns centralized here.
1108
+ * Components should reuse these mixins instead of duplicating query logic.
1109
+ */
1110
+ /*
1111
+ * Desktop-up mixin:
1112
+ * 1) Enable desktop enhancement in wider containers
1113
+ * 2) Keep viewport media query as fallback
1114
+ */
1115
+ /* ============================================================================
1116
+ 根元素
1117
+ ============================================================================ */
1118
+ .taskon-switch {
1119
+ position: relative;
1120
+ display: inline-flex;
1121
+ align-items: center;
1122
+ vertical-align: middle;
1123
+ font-weight: 500;
1124
+ font-size: 12px;
1125
+ line-height: 130%;
1126
+ color: var(--taskon-color-text-secondary);
1127
+ cursor: pointer;
1128
+ user-select: none;
1129
+ }
1130
+ /* 禁用状态 */
1131
+ .taskon-switch--disabled {
1132
+ cursor: not-allowed;
1133
+ opacity: 0.5;
1134
+ }
1135
+ /* ============================================================================
1136
+ 标签文字
1137
+ ============================================================================ */
1138
+ .taskon-switch__label {
1139
+ cursor: pointer;
1140
+ }
1141
+ .taskon-switch__label--disabled {
1142
+ cursor: not-allowed;
1143
+ }
1144
+ /* ============================================================================
1145
+ 开关按钮
1146
+ ============================================================================ */
1147
+ .taskon-switch__button {
1148
+ position: relative;
1149
+ width: 32px;
1150
+ height: 18px;
1151
+ line-height: 20px;
1152
+ background: var(--taskon-color-bg-surface-strong);
1153
+ border: 1px solid var(--taskon-color-border);
1154
+ border-radius: 100px;
1155
+ padding: 2px;
1156
+ margin-left: 10px;
1157
+ transition: all 0.3s ease;
1158
+ flex-shrink: 0;
1159
+ }
1160
+ /* 开启状态 - 默认渐变背景 */
1161
+ .taskon-switch__button--active {
1162
+ background: linear-gradient(
1163
+ 90deg,
1164
+ var(--taskon-color-primary) 0%,
1165
+ var(--taskon-color-secondary) 100%
1166
+ );
1167
+ border-color: transparent;
1168
+ }
1169
+ /* 禁用状态 */
1170
+ .taskon-switch__button--disabled {
1171
+ cursor: not-allowed;
1172
+ }
1173
+ /* ============================================================================
1174
+ 滑块
1175
+ ============================================================================ */
1176
+ .taskon-switch__slider {
1177
+ width: 12px;
1178
+ height: 12px;
1179
+ border-radius: 50%;
1180
+ background: var(--taskon-color-text);
1181
+ transition: margin-left 0.3s ease;
1182
+ }
1183
+ /* 开启状态的滑块位置 */
1184
+ .taskon-switch__button--active .taskon-switch__slider {
1185
+ margin-left: 14px;
1186
+ background: var(--taskon-color-text-on-primary);
1187
+ }
1188
+ /* ============================================================================
1189
+ 高亮样式 (highlight type)
1190
+ ============================================================================ */
1191
+ .taskon-switch--highlight .taskon-switch__button {
1192
+ background: var(--taskon-color-bg-surface-subtle);
1193
+ }
1194
+ .taskon-switch--highlight .taskon-switch__button--active {
1195
+ background: var(--taskon-color-primary-bg);
1196
+ border: 1px solid var(--taskon-color-border-secondary);
1197
+ }
1198
+ .taskon-switch--highlight .taskon-switch__button--active .taskon-switch__slider {
1199
+ background: var(--taskon-color-primary);
1200
+ }
1201
+ @supports (container-type: inline-size) {
1202
+ @container (min-width: 751px) {
1203
+ .taskon-switch {
1204
+ font-weight: 400;
1205
+ font-size: 16px;
1206
+ line-height: 23px;
1207
+ }
1208
+
1209
+ .taskon-switch__button {
1210
+ width: 38px;
1211
+ height: 20px;
1212
+ padding: 2px 3px;
1213
+ margin-left: 15px;
1214
+ }
1215
+
1216
+ .taskon-switch__slider {
1217
+ width: 14px;
1218
+ height: 14px;
1219
+ }
1220
+
1221
+ .taskon-switch__button--active .taskon-switch__slider {
1222
+ margin-left: 18px;
1223
+ }
1224
+ }
1225
+ }
1226
+ @supports not (container-type: inline-size) {
1227
+ @media (min-width: 751px) {
1228
+ .taskon-switch {
1229
+ font-weight: 400;
1230
+ font-size: 16px;
1231
+ line-height: 23px;
1232
+ }
1233
+
1234
+ .taskon-switch__button {
1235
+ width: 38px;
1236
+ height: 20px;
1237
+ padding: 2px 3px;
1238
+ margin-left: 15px;
1239
+ }
1240
+
1241
+ .taskon-switch__slider {
1242
+ width: 14px;
1243
+ height: 14px;
1244
+ }
1245
+
1246
+ .taskon-switch__button--active .taskon-switch__slider {
1247
+ margin-left: 18px;
1248
+ }
1249
+ }
1250
+ }
1251
+ /**
1252
+ * ClaimNftDialog 样式
1253
+ */
1254
+
1255
+ .taskon-claim-dialog {
1256
+ max-width: 400px;
1257
+ }
1258
+
1259
+ .taskon-claim-dialog-content {
1260
+ display: flex;
1261
+ flex-direction: column;
1262
+ align-items: center;
1263
+ padding: 24px;
1264
+ text-align: center;
1265
+ color: var(--taskon-color-text);
1266
+ }
1267
+
1268
+ /* NFT 图片 */
1269
+
1270
+ .taskon-claim-dialog-nft {
1271
+ margin-bottom: 20px;
1272
+ }
1273
+
1274
+ .taskon-claim-dialog-nft__image {
1275
+ width: 120px;
1276
+ height: 120px;
1277
+ border-radius: 12px;
1278
+ object-fit: cover;
1279
+ }
1280
+
1281
+ /* 状态图标区域 */
1282
+
1283
+ .taskon-claim-dialog-status {
1284
+ margin-bottom: 16px;
1285
+ min-height: 48px;
1286
+ display: flex;
1287
+ align-items: center;
1288
+ justify-content: center;
1289
+ }
1290
+
1291
+ /* 加载动画 */
1292
+
1293
+ .taskon-claim-dialog-spinner {
1294
+ width: 48px;
1295
+ height: 48px;
1296
+ position: relative;
1297
+ }
1298
+
1299
+ .taskon-claim-dialog-spinner__circle {
1300
+ width: 100%;
1301
+ height: 100%;
1302
+ border: 3px solid var(--taskon-color-border-secondary);
1303
+ border-top-color: var(--taskon-color-primary);
1304
+ border-radius: 50%;
1305
+ animation: taskon-claim-spin 0.8s linear infinite;
1306
+ }
1307
+
1308
+ @keyframes taskon-claim-spin {
1309
+ to {
1310
+ transform: rotate(360deg);
1311
+ }
1312
+ }
1313
+
1314
+ /* 状态图标 */
1315
+
1316
+ .taskon-claim-dialog-icon {
1317
+ width: 48px;
1318
+ height: 48px;
1319
+ }
1320
+
1321
+ .taskon-claim-dialog-icon--success {
1322
+ color: var(--taskon-color-success);
1323
+ }
1324
+
1325
+ .taskon-claim-dialog-icon--error {
1326
+ color: var(--taskon-color-error);
1327
+ }
1328
+
1329
+ /* 状态消息 */
1330
+
1331
+ .taskon-claim-dialog-message {
1332
+ font-size: var(--taskon-font-size-lg);
1333
+ font-weight: 500;
1334
+ color: var(--taskon-color-text);
1335
+ margin: 0 0 16px;
1336
+ line-height: 1.5;
1337
+ width: 100%;
1338
+ max-width: 100%;
1339
+ overflow-wrap: anywhere;
1340
+ word-break: break-word;
1341
+ }
1342
+
1343
+ /* 交易 Hash */
1344
+
1345
+ .taskon-claim-dialog-tx {
1346
+ display: flex;
1347
+ align-items: center;
1348
+ gap: 8px;
1349
+ padding: 8px 16px;
1350
+ background: var(--taskon-color-bg-surface-subtle);
1351
+ border-radius: 8px;
1352
+ margin-bottom: 20px;
1353
+ font-size: var(--taskon-font-size);
1354
+ }
1355
+
1356
+ .taskon-claim-dialog-tx__label {
1357
+ color: var(--taskon-color-text-tertiary);
1358
+ }
1359
+
1360
+ .taskon-claim-dialog-tx__hash {
1361
+ color: var(--taskon-color-link);
1362
+ font-family: monospace;
1363
+ }
1364
+
1365
+ /* 操作按钮 */
1366
+
1367
+ .taskon-claim-dialog-actions {
1368
+ display: flex;
1369
+ gap: 12px;
1370
+ width: 100%;
1371
+ justify-content: center;
1372
+ }
1373
+
1374
+ .taskon-claim-dialog-btn {
1375
+ padding: 10px 24px;
1376
+ border-radius: 8px;
1377
+ font-size: var(--taskon-font-size);
1378
+ font-weight: 500;
1379
+ cursor: pointer;
1380
+ transition: all 0.2s ease;
1381
+ border: none;
1382
+ }
1383
+
1384
+ .taskon-claim-dialog-btn--primary {
1385
+ background: var(--taskon-color-primary);
1386
+ color: var(--taskon-color-text-on-primary);
1387
+ }
1388
+
1389
+ .taskon-claim-dialog-btn--primary:hover {
1390
+ filter: brightness(0.95);
1391
+ }
1392
+
1393
+ .taskon-claim-dialog-btn--secondary {
1394
+ background: transparent;
1395
+ color: var(--taskon-color-text);
1396
+ border: 1px solid var(--taskon-color-border);
1397
+ }
1398
+
1399
+ .taskon-claim-dialog-btn--secondary:hover {
1400
+ background: var(--taskon-color-bg-surface-strong);
1401
+ }
1402
+
1403
+ @media (max-width: 750px) {
1404
+ .taskon-claim-dialog {
1405
+ max-width: 100%;
1406
+ }
1407
+
1408
+ .taskon-claim-dialog-content {
1409
+ padding: 16px;
1410
+ }
1411
+
1412
+ .taskon-claim-dialog-nft {
1413
+ margin-bottom: 16px;
1414
+ }
1415
+
1416
+ .taskon-claim-dialog-nft__image {
1417
+ width: 96px;
1418
+ height: 96px;
1419
+ }
1420
+
1421
+ .taskon-claim-dialog-status {
1422
+ margin-bottom: 12px;
1423
+ min-height: 40px;
1424
+ }
1425
+
1426
+ .taskon-claim-dialog-spinner,
1427
+ .taskon-claim-dialog-icon {
1428
+ width: 40px;
1429
+ height: 40px;
1430
+ }
1431
+
1432
+ .taskon-claim-dialog-message {
1433
+ font-size: var(--taskon-font-size);
1434
+ margin-bottom: 12px;
1435
+ }
1436
+
1437
+ .taskon-claim-dialog-tx {
1438
+ align-items: flex-start;
1439
+ flex-direction: column;
1440
+ gap: 4px;
1441
+ margin-bottom: 16px;
1442
+ }
1443
+
1444
+ .taskon-claim-dialog-tx__hash {
1445
+ display: block;
1446
+ max-width: 100%;
1447
+ overflow-wrap: anywhere;
1448
+ }
1449
+
1450
+ .taskon-claim-dialog-actions {
1451
+ flex-direction: column;
1452
+ gap: 8px;
1453
+ }
1454
+
1455
+ .taskon-claim-dialog-btn {
1456
+ width: 100%;
1457
+ padding: 9px 12px;
1458
+ }
1459
+ }
1460
+ /**
1461
+ * PendingTxDialog 样式
1462
+ */
1463
+
1464
+ .taskon-pending-dialog {
1465
+ max-width: 460px;
1466
+ }
1467
+
1468
+ .taskon-pending-dialog-content {
1469
+ display: flex;
1470
+ flex-direction: column;
1471
+ gap: 16px;
1472
+ }
1473
+
1474
+ .taskon-pending-dialog-title {
1475
+ margin: 0;
1476
+ font-size: var(--taskon-font-size-lg);
1477
+ line-height: 1.5;
1478
+ color: var(--taskon-color-text);
1479
+ }
1480
+
1481
+ .taskon-pending-dialog-desc {
1482
+ margin: 0;
1483
+ font-size: var(--taskon-font-size);
1484
+ line-height: 1.43;
1485
+ color: var(--taskon-color-text-tertiary);
1486
+ }
1487
+
1488
+ .taskon-pending-dialog-hash-wrap {
1489
+ display: flex;
1490
+ flex-wrap: wrap;
1491
+ align-items: center;
1492
+ gap: 8px;
1493
+ }
1494
+
1495
+ .taskon-pending-dialog-hash-label {
1496
+ font-size: var(--taskon-font-size);
1497
+ color: var(--taskon-color-text-tertiary);
1498
+ }
1499
+
1500
+ .taskon-pending-dialog-hash-link,
1501
+ .taskon-pending-dialog-hash-value {
1502
+ font-size: var(--taskon-font-size);
1503
+ color: var(--taskon-color-link);
1504
+ text-decoration: underline;
1505
+ background: none;
1506
+ border: none;
1507
+ padding: 0;
1508
+ }
1509
+
1510
+ .taskon-pending-dialog-hash-link {
1511
+ cursor: pointer;
1512
+ }
1513
+
1514
+ .taskon-pending-dialog-notice-list {
1515
+ margin: 0;
1516
+ padding-left: 18px;
1517
+ list-style: disc;
1518
+ display: flex;
1519
+ flex-direction: column;
1520
+ gap: 10px;
1521
+ }
1522
+
1523
+ .taskon-pending-dialog-notice-item {
1524
+ font-size: var(--taskon-font-size-sm);
1525
+ line-height: 1.5;
1526
+ color: var(--taskon-color-link);
1527
+ }
1528
+
1529
+ .taskon-pending-dialog-receive-address {
1530
+ margin-top: 4px;
1531
+ word-break: break-all;
1532
+ }
1533
+
1534
+ .taskon-pending-dialog-actions {
1535
+ display: flex;
1536
+ justify-content: flex-end;
1537
+ gap: 12px;
1538
+ margin-top: 8px;
1539
+ }
1540
+
1541
+ .taskon-pending-dialog-btn {
1542
+ padding: 10px 18px;
1543
+ border-radius: 8px;
1544
+ border: none;
1545
+ font-size: var(--taskon-font-size);
1546
+ font-weight: 500;
1547
+ cursor: pointer;
1548
+ transition: all 0.2s ease;
1549
+ }
1550
+
1551
+ .taskon-pending-dialog-btn--primary {
1552
+ background: var(--taskon-color-primary);
1553
+ color: var(--taskon-color-text-on-primary);
1554
+ }
1555
+
1556
+ .taskon-pending-dialog-btn--primary:hover {
1557
+ opacity: 0.92;
1558
+ }
1559
+
1560
+ .taskon-pending-dialog-btn--secondary {
1561
+ background: transparent;
1562
+ color: var(--taskon-color-text);
1563
+ border: 1px solid var(--taskon-color-border);
1564
+ }
1565
+
1566
+ .taskon-pending-dialog-btn--secondary:hover {
1567
+ background: var(--taskon-color-bg-surface-strong);
1568
+ }
1569
+
1570
+ @media (max-width: 750px) {
1571
+ .taskon-pending-dialog {
1572
+ max-width: 100%;
1573
+ }
1574
+
1575
+ .taskon-pending-dialog-content {
1576
+ gap: 12px;
1577
+ }
1578
+
1579
+ .taskon-pending-dialog-title {
1580
+ font-size: var(--taskon-font-size);
1581
+ line-height: 1.57;
1582
+ }
1583
+
1584
+ .taskon-pending-dialog-desc,
1585
+ .taskon-pending-dialog-hash-label,
1586
+ .taskon-pending-dialog-hash-link,
1587
+ .taskon-pending-dialog-hash-value {
1588
+ font-size: var(--taskon-font-size-sm);
1589
+ line-height: 1.5;
1590
+ }
1591
+
1592
+ .taskon-pending-dialog-notice-item {
1593
+ font-size: var(--taskon-font-size-sm);
1594
+ line-height: 1.33;
1595
+ }
1596
+
1597
+ .taskon-pending-dialog-actions {
1598
+ align-items: stretch;
1599
+ flex-direction: column;
1600
+ gap: 8px;
1601
+ }
1602
+
1603
+ .taskon-pending-dialog-btn {
1604
+ width: 100%;
1605
+ padding: 9px 12px;
1606
+ }
1607
+ }
1608
+ /**
1609
+ * Points 表格样式
1610
+ *
1611
+ * 从 UserCenterWidget.css 拆分,便于独立使用
1612
+ */
1613
+
1614
+ /* ========== Points List ========== */
1615
+
1616
+ .taskon-points-list {
1617
+ width: 100%;
1618
+ }
1619
+
1620
+ .taskon-points-list__header {
1621
+ display: flex;
1622
+ align-items: center;
1623
+ gap: var(--taskon-spacing-sm);
1624
+ margin-bottom: var(--taskon-spacing-md);
1625
+ }
1626
+
1627
+ .taskon-points-list__icon {
1628
+ width: 32px;
1629
+ height: 32px;
1630
+ border-radius: 50%;
1631
+ object-fit: cover;
1632
+ }
1633
+
1634
+ .taskon-points-list__title {
1635
+ font-size: var(--taskon-font-size-lg);
1636
+ font-weight: 600;
1637
+ color: var(--taskon-color-text);
1638
+ margin: 0;
1639
+ }
1640
+
1641
+ .taskon-points-list__total {
1642
+ display: flex;
1643
+ align-items: baseline;
1644
+ gap: var(--taskon-spacing-xs);
1645
+ margin-left: auto;
1646
+ }
1647
+
1648
+ .taskon-points-list__total-value {
1649
+ font-size: 20px;
1650
+ font-weight: 700;
1651
+ color: var(--taskon-color-text);
1652
+ }
1653
+
1654
+ .taskon-points-list__total-label {
1655
+ font-size: var(--taskon-font-size-sm);
1656
+ color: var(--taskon-color-text-secondary);
1657
+ }
1658
+
1659
+ .taskon-points-list__table {
1660
+ width: 100%;
1661
+ border: 1px solid var(--taskon-color-border);
1662
+ border-radius: var(--taskon-border-radius-sm);
1663
+ overflow: hidden;
1664
+ }
1665
+
1666
+ .taskon-points-list__row {
1667
+ display: flex;
1668
+ align-items: center;
1669
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
1670
+ border-bottom: 1px solid var(--taskon-color-border);
1671
+ transition: background-color 0.2s ease;
1672
+ }
1673
+
1674
+ .taskon-points-list__row:last-child {
1675
+ border-bottom: none;
1676
+ }
1677
+
1678
+ .taskon-points-list__row:hover {
1679
+ background-color: var(--taskon-color-bg-surface-strong);
1680
+ }
1681
+
1682
+ .taskon-points-list__cell {
1683
+ display: flex;
1684
+ align-items: center;
1685
+ }
1686
+
1687
+ .taskon-points-list__cell--main {
1688
+ flex: 1;
1689
+ display: flex;
1690
+ flex-direction: column;
1691
+ gap: 2px;
1692
+ overflow: hidden;
1693
+ }
1694
+
1695
+ .taskon-points-list__cell--amount {
1696
+ font-size: var(--taskon-font-size);
1697
+ font-weight: 600;
1698
+ white-space: nowrap;
1699
+ }
1700
+
1701
+ .taskon-points-list__cell--amount.positive {
1702
+ color: var(--taskon-color-success);
1703
+ }
1704
+
1705
+ .taskon-points-list__cell--amount.negative {
1706
+ color: var(--taskon-color-error);
1707
+ }
1708
+
1709
+ .taskon-points-list__cell--time {
1710
+ font-size: var(--taskon-font-size-sm);
1711
+ color: var(--taskon-color-text-secondary);
1712
+ white-space: nowrap;
1713
+ }
1714
+
1715
+ .taskon-points-list__primary {
1716
+ font-size: var(--taskon-font-size);
1717
+ font-weight: 500;
1718
+ color: var(--taskon-color-text);
1719
+ white-space: nowrap;
1720
+ overflow: hidden;
1721
+ text-overflow: ellipsis;
1722
+ }
1723
+
1724
+ .taskon-points-list__secondary {
1725
+ font-size: var(--taskon-font-size-sm);
1726
+ color: var(--taskon-color-text-secondary);
1727
+ white-space: nowrap;
1728
+ overflow: hidden;
1729
+ text-overflow: ellipsis;
1730
+ }
1731
+
1732
+ .taskon-points-list__loading-more {
1733
+ display: flex;
1734
+ justify-content: center;
1735
+ padding: var(--taskon-spacing-md);
1736
+ }
1737
+
1738
+ .taskon-points-list__table-wrap {
1739
+ margin-top: var(--taskon-spacing-md);
1740
+ }
1741
+
1742
+ .taskon-points-list__name {
1743
+ font-size: var(--taskon-font-size);
1744
+ font-weight: 500;
1745
+ color: var(--taskon-color-text);
1746
+ }
1747
+
1748
+ .taskon-points-list__time {
1749
+ font-size: var(--taskon-font-size-sm);
1750
+ color: var(--taskon-color-text-secondary);
1751
+ white-space: nowrap;
1752
+ }
1753
+
1754
+ .taskon-points-list__amount-cell {
1755
+ display: flex;
1756
+ align-items: center;
1757
+ justify-content: flex-end;
1758
+ gap: 6px;
1759
+ }
1760
+
1761
+ .taskon-points-list__amount-icon {
1762
+ width: 20px;
1763
+ height: 20px;
1764
+ border-radius: 50%;
1765
+ flex-shrink: 0;
1766
+ }
1767
+
1768
+ .taskon-points-list__amount-value {
1769
+ font-size: var(--taskon-font-size);
1770
+ font-weight: 600;
1771
+ white-space: nowrap;
1772
+ }
1773
+
1774
+ .taskon-points-list__amount-value--positive {
1775
+ color: var(--taskon-color-success);
1776
+ }
1777
+
1778
+ .taskon-points-list__amount-value--negative {
1779
+ color: var(--taskon-color-error);
1780
+ }
1781
+
1782
+ @media (max-width: 750px) {
1783
+ .taskon-points-list__header {
1784
+ align-items: flex-start;
1785
+ flex-wrap: wrap;
1786
+ gap: var(--taskon-spacing-xs);
1787
+ margin-bottom: var(--taskon-spacing-sm);
1788
+ }
1789
+
1790
+ .taskon-points-list__icon {
1791
+ width: 28px;
1792
+ height: 28px;
1793
+ }
1794
+
1795
+ .taskon-points-list__title {
1796
+ font-size: var(--taskon-font-size);
1797
+ line-height: 1.43;
1798
+ }
1799
+
1800
+ .taskon-points-list__total {
1801
+ justify-content: flex-end;
1802
+ margin-left: 0;
1803
+ width: 100%;
1804
+ }
1805
+
1806
+ .taskon-points-list__total-value {
1807
+ font-size: var(--taskon-font-size-lg);
1808
+ }
1809
+
1810
+ .taskon-points-list__name,
1811
+ .taskon-points-list__amount-value {
1812
+ font-size: var(--taskon-font-size-sm);
1813
+ }
1814
+
1815
+ .taskon-points-list__time {
1816
+ font-size: var(--taskon-font-size-sm);
1817
+ }
1818
+
1819
+ .taskon-points-list__amount-icon {
1820
+ width: 16px;
1821
+ height: 16px;
1822
+ }
1823
+ }
1824
+ /**
1825
+ * AssetImage 组件样式
1826
+ */
1827
+
1828
+ .taskon-asset-image {
1829
+ position: relative;
1830
+ flex-shrink: 0;
1831
+ }
1832
+
1833
+ .taskon-asset-image__main {
1834
+ display: block;
1835
+ width: 100%;
1836
+ height: 100%;
1837
+ border-radius: 4px;
1838
+ object-fit: cover;
1839
+ }
1840
+
1841
+ .taskon-asset-image__placeholder {
1842
+ width: 100%;
1843
+ height: 100%;
1844
+ border-radius: 4px;
1845
+ background-color: var(--taskon-color-bg-surface-subtle);
1846
+ }
1847
+
1848
+ .taskon-asset-image__chain {
1849
+ position: absolute;
1850
+ right: -4px;
1851
+ bottom: -4px;
1852
+ width: 18px;
1853
+ height: 18px;
1854
+ border-radius: 50%;
1855
+ background-color: var(--taskon-color-bg-surface);
1856
+ box-shadow: 0 1px 2px var(--taskon-color-border-secondary);
1857
+ }
1858
+ /**
1859
+ * RewardTables 通用样式
1860
+ */
1861
+
1862
+ .taskon-reward-table {
1863
+ width: 100%;
1864
+ }
1865
+
1866
+ /* Campaign 名称 */
1867
+
1868
+ .taskon-reward-table__campaign-name {
1869
+ color: var(--taskon-color-text);
1870
+ font-size: var(--taskon-font-size);
1871
+ font-weight: 500;
1872
+ line-height: 1.5;
1873
+ word-break: break-word;
1874
+ }
1875
+
1876
+ /* Role 名称 */
1877
+
1878
+ .taskon-reward-table__role-name {
1879
+ color: var(--taskon-color-text);
1880
+ font-size: var(--taskon-font-size);
1881
+ font-weight: 500;
1882
+ line-height: 1.5;
1883
+ }
1884
+
1885
+ /* 时间 */
1886
+
1887
+ .taskon-reward-table__time {
1888
+ color: var(--taskon-color-text-secondary);
1889
+ font-size: var(--taskon-font-size-sm);
1890
+ white-space: nowrap;
1891
+ }
1892
+
1893
+ /* 手动发放状态 */
1894
+
1895
+ .taskon-reward-table__manual-drop {
1896
+ color: var(--taskon-color-text-tertiary);
1897
+ font-size: var(--taskon-font-size-sm);
1898
+ }
1899
+
1900
+ /* 链接样式 */
1901
+
1902
+ .taskon-reward-table__link {
1903
+ background: none;
1904
+ border: none;
1905
+ padding: 0;
1906
+ color: var(--taskon-color-primary);
1907
+ font-size: var(--taskon-font-size-sm);
1908
+ cursor: pointer;
1909
+ text-decoration: none;
1910
+ }
1911
+
1912
+ .taskon-reward-table__link:hover {
1913
+ text-decoration: underline;
1914
+ }
1915
+
1916
+ /* Claim 按钮 */
1917
+
1918
+ .taskon-reward-table__claim-btn {
1919
+ display: inline-flex;
1920
+ align-items: center;
1921
+ justify-content: center;
1922
+ height: 28px;
1923
+ padding: 0 12px;
1924
+ background-color: var(--taskon-color-primary);
1925
+ color: var(--taskon-color-text-on-primary);
1926
+ font-size: var(--taskon-font-size-sm);
1927
+ font-weight: 500;
1928
+ border: none;
1929
+ border-radius: 4px;
1930
+ cursor: pointer;
1931
+ transition: background-color 0.2s;
1932
+ }
1933
+
1934
+ .taskon-reward-table__claim-btn:hover {
1935
+ background-color: var(--taskon-color-primary-hover);
1936
+ }
1937
+
1938
+ /* Points 表格特殊样式 */
1939
+
1940
+ .taskon-reward-table__points-name {
1941
+ display: flex;
1942
+ align-items: center;
1943
+ gap: 8px;
1944
+ }
1945
+
1946
+ .taskon-reward-table__points-icon {
1947
+ width: 20px;
1948
+ height: 20px;
1949
+ border-radius: 50%;
1950
+ flex-shrink: 0;
1951
+ }
1952
+
1953
+ .taskon-reward-table__points-amount {
1954
+ font-size: var(--taskon-font-size);
1955
+ font-weight: 500;
1956
+ }
1957
+
1958
+ .taskon-reward-table__points-amount--positive {
1959
+ color: var(--taskon-color-success);
1960
+ }
1961
+
1962
+ .taskon-reward-table__points-amount--negative {
1963
+ color: var(--taskon-color-error);
1964
+ }
1965
+ /**
1966
+ * TokenHistoryTable 表格样式
1967
+ *
1968
+ * 从 RewardTables.css 拆分,便于独立使用
1969
+ */
1970
+
1971
+ /* ========== Token History 表格样式 ========== */
1972
+
1973
+ /* Amount 列容器 */
1974
+
1975
+ .taskon-token-history__amount {
1976
+ display: flex;
1977
+ flex-direction: column;
1978
+ align-items: flex-end;
1979
+ gap: 6px;
1980
+ }
1981
+
1982
+ /* Token 信息行 */
1983
+
1984
+ .taskon-token-history__token-info {
1985
+ display: flex;
1986
+ align-items: center;
1987
+ gap: 4px;
1988
+ }
1989
+
1990
+ /* Token 金额值 */
1991
+
1992
+ .taskon-token-history__token-value {
1993
+ color: var(--taskon-color-success);
1994
+ font-weight: 500;
1995
+ }
1996
+
1997
+ /* Token 名称 */
1998
+
1999
+ .taskon-token-history__token-name {
2000
+ color: var(--taskon-color-text);
2001
+ }
2002
+
2003
+ /* 链图标 */
2004
+
2005
+ .taskon-token-history__chain-icon {
2006
+ width: 18px;
2007
+ height: 18px;
2008
+ margin-left: 6px;
2009
+ border-radius: 50%;
2010
+ }
2011
+
2012
+ /* 分发方信息 */
2013
+
2014
+ .taskon-token-history__distribute {
2015
+ display: flex;
2016
+ align-items: center;
2017
+ justify-content: flex-end;
2018
+ }
2019
+
2020
+ /* Deposited 标签(TaskOn 托管发放) */
2021
+
2022
+ .taskon-token-history__deposited {
2023
+ font-size: var(--taskon-font-size-sm);
2024
+ line-height: 1.25;
2025
+ background: linear-gradient(84deg, #e3bc4e 3%, #fffdb6 99.34%);
2026
+ background-clip: text;
2027
+ -webkit-background-clip: text;
2028
+ -webkit-text-fill-color: transparent;
2029
+ }
2030
+
2031
+ /* Distributed by 容器 */
2032
+
2033
+ .taskon-token-history__distributed-by {
2034
+ display: flex;
2035
+ align-items: center;
2036
+ gap: 6px;
2037
+ }
2038
+
2039
+ /* Distributed by 标签 */
2040
+
2041
+ .taskon-token-history__distributed-label {
2042
+ color: var(--taskon-color-text-tertiary);
2043
+ font-size: var(--taskon-font-size-sm);
2044
+ line-height: 1.25;
2045
+ }
2046
+
2047
+ /* 社区头像 */
2048
+
2049
+ .taskon-token-history__community-avatar {
2050
+ width: 14px;
2051
+ height: 14px;
2052
+ border-radius: 50%;
2053
+ object-fit: cover;
2054
+ }
2055
+ /**
2056
+ * TokenSelect 组件样式
2057
+ *
2058
+ * 基于 Vue WithdrawTokenSelect 组件样式
2059
+ */
2060
+
2061
+ /* ========== 自定义触发器样式 ========== */
2062
+
2063
+ .taskon-token-select__label .taskon-select__trigger-icon {
2064
+ width: 16px;
2065
+ height: 16px;
2066
+ }
2067
+
2068
+ /* ========== 链信息 ========== */
2069
+
2070
+ .taskon-token-select__chain-info {
2071
+ display: inline-flex;
2072
+ align-items: center;
2073
+ gap: 8px;
2074
+ width: 33.33%;
2075
+ min-width: 0;
2076
+ flex-shrink: 0;
2077
+ }
2078
+
2079
+ .taskon-token-select__chain-icon {
2080
+ width: 16px;
2081
+ height: 16px;
2082
+ border-radius: 50%;
2083
+ flex-shrink: 0;
2084
+ }
2085
+
2086
+ .taskon-token-select__chain-label {
2087
+ font-size: var(--taskon-font-size);
2088
+ font-weight: 500;
2089
+ color: var(--taskon-color-text);
2090
+ overflow: hidden;
2091
+ text-overflow: ellipsis;
2092
+ white-space: nowrap;
2093
+ max-width: 100px;
2094
+ }
2095
+
2096
+ /* ========== 余额显示 ========== */
2097
+
2098
+ .taskon-token-select__balance {
2099
+ font-size: var(--taskon-font-size);
2100
+ color: var(--taskon-color-text-tertiary);
2101
+ margin-left: auto;
2102
+ flex-shrink: 0;
2103
+ }
2104
+
2105
+ /* ========== 响应式 ========== */
2106
+
2107
+ @media (max-width: 750px) {
2108
+ .taskon-token-select__chain-icon {
2109
+ width: 14px;
2110
+ height: 14px;
2111
+ }
2112
+
2113
+ .taskon-token-select__chain-label {
2114
+ font-size: var(--taskon-font-size-sm);
2115
+ max-width: 80px;
2116
+ }
2117
+
2118
+ .taskon-token-select__balance {
2119
+ font-size: var(--taskon-font-size-sm);
2120
+ }
2121
+ }
2122
+ /**
2123
+ * ReceiverAddress 组件样式
2124
+ *
2125
+ * 基于 Vue 版本样式实现
2126
+ * - 两列布局:链信息 + 地址
2127
+ * - 深色背景卡片样式
2128
+ */
2129
+
2130
+ /* ========== 根容器 ========== */
2131
+
2132
+ .taskon-receiver-address {
2133
+ display: flex;
2134
+ align-items: center;
2135
+ gap: var(--taskon-spacing-sm);
2136
+ font-size: var(--taskon-font-size);
2137
+ }
2138
+
2139
+ /* ========== 链信息 ========== */
2140
+
2141
+ .taskon-receiver-address__chain {
2142
+ display: flex;
2143
+ align-items: center;
2144
+ gap: var(--taskon-spacing-sm);
2145
+ flex: 1;
2146
+ height: 46px;
2147
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
2148
+ background: var(--taskon-color-bg-inset);
2149
+ border-radius: var(--taskon-border-radius);
2150
+ font-weight: 500;
2151
+ color: var(--taskon-color-text);
2152
+ }
2153
+
2154
+ /* ========== 链图标 ========== */
2155
+
2156
+ .taskon-receiver-address__chain-icon {
2157
+ width: 20px;
2158
+ height: 20px;
2159
+ border-radius: 50%;
2160
+ flex-shrink: 0;
2161
+ }
2162
+
2163
+ /* ========== 链名称 ========== */
2164
+
2165
+ .taskon-receiver-address__chain-label {
2166
+ overflow: hidden;
2167
+ text-overflow: ellipsis;
2168
+ white-space: nowrap;
2169
+ }
2170
+
2171
+ /* ========== 地址 ========== */
2172
+
2173
+ .taskon-receiver-address__address {
2174
+ flex: 1;
2175
+ height: 46px;
2176
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
2177
+ background: var(--taskon-color-bg-inset);
2178
+ border-radius: var(--taskon-border-radius);
2179
+ font-weight: 500;
2180
+ color: var(--taskon-color-text);
2181
+ display: flex;
2182
+ align-items: center;
2183
+ overflow: hidden;
2184
+ text-overflow: ellipsis;
2185
+ white-space: nowrap;
2186
+ }
2187
+
2188
+ /* ========== 响应式 ========== */
2189
+
2190
+ @media (max-width: 750px) {
2191
+ .taskon-receiver-address {
2192
+ flex-direction: column;
2193
+ gap: var(--taskon-spacing-sm);
2194
+ }
2195
+
2196
+ .taskon-receiver-address__chain,
2197
+ .taskon-receiver-address__address {
2198
+ width: 100%;
2199
+ height: 40px;
2200
+ padding: 10px 16px;
2201
+ font-size: var(--taskon-font-size-sm);
2202
+ }
2203
+
2204
+ .taskon-receiver-address__chain-icon {
2205
+ width: 16px;
2206
+ height: 16px;
2207
+ }
2208
+ }
2209
+ /**
2210
+ * BatchTokenTable 组件样式
2211
+ *
2212
+ * 采用 BEM 命名规范
2213
+ * 前缀: taskon-batch-token-table
2214
+ *
2215
+ * 参考 Vue 版本 TokenTable.vue 样式实现
2216
+ */
2217
+
2218
+ /* ============================================================================
2219
+ 根容器
2220
+ ============================================================================ */
2221
+
2222
+ .taskon-batch-token-table {
2223
+ position: relative;
2224
+ width: 100%;
2225
+ }
2226
+
2227
+ /* ============================================================================
2228
+ 表格样式覆盖
2229
+ ============================================================================ */
2230
+
2231
+ .taskon-batch-token-table__table {
2232
+ min-height: auto;
2233
+ }
2234
+
2235
+ /* 表格紧凑模式下的行高调整 */
2236
+
2237
+ .taskon-batch-token-table__table .taskon-table__row {
2238
+ height: 55px;
2239
+ }
2240
+
2241
+ /* 表头样式 */
2242
+
2243
+ .taskon-batch-token-table__table .taskon-table__header {
2244
+ font-size: var(--taskon-font-size);
2245
+ line-height: 2.29;
2246
+ padding: 0 10px;
2247
+ }
2248
+
2249
+ /* 单元格样式 */
2250
+
2251
+ .taskon-batch-token-table__table .taskon-table__cell {
2252
+ font-size: var(--taskon-font-size);
2253
+ line-height: 1.43;
2254
+ padding: 0 10px;
2255
+ font-weight: 400;
2256
+ }
2257
+
2258
+ /* ============================================================================
2259
+ 禁用行样式(不可提现)
2260
+ ============================================================================ */
2261
+
2262
+ .taskon-batch-token-table__row--disabled {
2263
+ opacity: 0.4;
2264
+ pointer-events: none;
2265
+ }
2266
+
2267
+ /* ============================================================================
2268
+ Token 单元格样式
2269
+ ============================================================================ */
2270
+
2271
+ .taskon-batch-token-table__token-cell {
2272
+ display: inline-flex;
2273
+ align-items: center;
2274
+ gap: 8px;
2275
+ }
2276
+
2277
+ .taskon-batch-token-table__token-icon {
2278
+ width: 20px;
2279
+ height: 20px;
2280
+ border-radius: 50%;
2281
+ object-fit: cover;
2282
+ }
2283
+
2284
+ /* ============================================================================
2285
+ 输入框样式
2286
+ ============================================================================ */
2287
+
2288
+ .taskon-batch-token-table__input {
2289
+ width: 96px;
2290
+ height: 32px;
2291
+ font-size: var(--taskon-font-size);
2292
+ text-align: center;
2293
+ }
2294
+
2295
+ .taskon-batch-token-table__input .taskon-input {
2296
+ height: 32px;
2297
+ padding: 4px 8px;
2298
+ font-size: var(--taskon-font-size);
2299
+ text-align: center;
2300
+ }
2301
+
2302
+ /* ============================================================================
2303
+ 分页样式
2304
+ ============================================================================ */
2305
+
2306
+ .taskon-batch-token-table__pagination {
2307
+ margin-top: 20px;
2308
+ display: flex;
2309
+ align-items: center;
2310
+ justify-content: center;
2311
+ }
2312
+
2313
+ /* ============================================================================
2314
+ 响应式 - 移动端适配
2315
+ ============================================================================ */
2316
+
2317
+ @media (max-width: 750px) {
2318
+ .taskon-batch-token-table__table .taskon-table__row {
2319
+ height: 44px;
2320
+ }
2321
+
2322
+ .taskon-batch-token-table__table .taskon-table__header {
2323
+ font-size: var(--taskon-font-size-sm);
2324
+ line-height: 2;
2325
+ padding: 0 4px;
2326
+ }
2327
+
2328
+ .taskon-batch-token-table__table .taskon-table__cell {
2329
+ font-size: var(--taskon-font-size-sm);
2330
+ line-height: 1.33;
2331
+ padding: 0 4px;
2332
+ }
2333
+
2334
+ .taskon-batch-token-table__token-icon {
2335
+ width: 16px;
2336
+ height: 16px;
2337
+ }
2338
+
2339
+ .taskon-batch-token-table__input {
2340
+ width: 64px;
2341
+ height: 28px;
2342
+ }
2343
+
2344
+ .taskon-batch-token-table__input .taskon-input {
2345
+ height: 28px;
2346
+ padding: 2px 4px;
2347
+ font-size: var(--taskon-font-size-sm);
2348
+ }
2349
+
2350
+ .taskon-batch-token-table__pagination {
2351
+ margin-top: 16px;
2352
+ }
2353
+ }
2354
+ /**
2355
+ * WithdrawFormInit 组件样式
2356
+ *
2357
+ * 提现表单初始状态的样式
2358
+ */
2359
+
2360
+ /* ========== 根容器 ========== */
2361
+
2362
+ .taskon-withdraw-form-init {
2363
+ display: flex;
2364
+ flex-direction: column;
2365
+ }
2366
+
2367
+ /* ========== 标题 ========== */
2368
+
2369
+ .taskon-withdraw-form-init__title {
2370
+ margin: 0 0 20px 0;
2371
+ font-size: var(--taskon-font-size-xxl);
2372
+ font-weight: 600;
2373
+ color: var(--taskon-color-text);
2374
+ line-height: 1.3;
2375
+ }
2376
+
2377
+ /* ========== 表单内容 ========== */
2378
+
2379
+ .taskon-withdraw-form-init__content {
2380
+ display: flex;
2381
+ flex-direction: column;
2382
+ gap: 16px;
2383
+ }
2384
+
2385
+ /* ========== 批量提现开关 ========== */
2386
+
2387
+ .taskon-withdraw-form-init__switch-wrap {
2388
+ display: flex;
2389
+ align-items: center;
2390
+ }
2391
+
2392
+ /* ========== 底部按钮 ========== */
2393
+
2394
+ .taskon-withdraw-form-init__footer {
2395
+ margin-top: 24px;
2396
+ }
2397
+
2398
+ .taskon-withdraw-form-init__submit {
2399
+ width: 100% !important;
2400
+ }
2401
+
2402
+ /* ========== 响应式 ========== */
2403
+
2404
+ @media (max-width: 750px) {
2405
+ .taskon-withdraw-form-init__title {
2406
+ font-size: var(--taskon-font-size-xxl);
2407
+ margin-bottom: 5.333vw;
2408
+ }
2409
+
2410
+ .taskon-withdraw-form-init__content {
2411
+ gap: 4.267vw;
2412
+ }
2413
+
2414
+ .taskon-withdraw-form-init__footer {
2415
+ margin-top: 6.4vw;
2416
+ }
2417
+ }
2418
+ /*
2419
+ * Responsive base styles
2420
+ *
2421
+ * Keep mobile breakpoints and fallback patterns centralized here.
2422
+ * Components should reuse these mixins instead of duplicating query logic.
2423
+ */
2424
+
2425
+ /*
2426
+ * Desktop-up mixin:
2427
+ * 1) Enable desktop enhancement in wider containers
2428
+ * 2) Keep viewport media query as fallback
2429
+ */
2430
+
2431
+ .taskon-withdraw-notice__tokens {
2432
+ margin-top: 14px;
2433
+ display: flex;
2434
+ flex-direction: column;
2435
+ gap: 8px;
2436
+ text-align: left;
2437
+ }
2438
+
2439
+ .taskon-withdraw-notice__token {
2440
+ display: flex;
2441
+ align-items: center;
2442
+ justify-content: space-between;
2443
+ padding: 10px 12px;
2444
+ background: var(--taskon-color-bg-surface-subtle);
2445
+ border: 1px solid var(--taskon-color-border);
2446
+ border-radius: var(--taskon-border-radius-sm);
2447
+ }
2448
+
2449
+ .taskon-withdraw-notice__token-info {
2450
+ display: flex;
2451
+ align-items: center;
2452
+ gap: 10px;
2453
+ min-width: 0;
2454
+ }
2455
+
2456
+ .taskon-withdraw-notice__token-icon {
2457
+ width: 28px;
2458
+ height: 28px;
2459
+ border-radius: 50%;
2460
+ object-fit: cover;
2461
+ flex-shrink: 0;
2462
+ }
2463
+
2464
+ .taskon-withdraw-notice__token-details {
2465
+ display: flex;
2466
+ flex-direction: column;
2467
+ min-width: 0;
2468
+ }
2469
+
2470
+ .taskon-withdraw-notice__token-symbol {
2471
+ font-size: var(--taskon-font-size);
2472
+ font-weight: 600;
2473
+ color: var(--taskon-color-text);
2474
+ line-height: 1.2;
2475
+ }
2476
+
2477
+ .taskon-withdraw-notice__token-chain {
2478
+ font-size: var(--taskon-font-size-sm);
2479
+ color: var(--taskon-color-text-secondary);
2480
+ line-height: 1.2;
2481
+ }
2482
+
2483
+ .taskon-withdraw-notice__token-amount {
2484
+ font-size: var(--taskon-font-size);
2485
+ font-weight: 600;
2486
+ color: var(--taskon-color-text);
2487
+ margin-left: 8px;
2488
+ }
2489
+
2490
+ .taskon-withdraw-notice__error {
2491
+ margin-top: 12px;
2492
+ padding: 10px 12px;
2493
+ font-size: var(--taskon-font-size-sm);
2494
+ color: var(--taskon-color-error);
2495
+ background: var(--taskon-color-error-bg);
2496
+ border-radius: var(--taskon-border-radius-sm);
2497
+ word-break: break-word;
2498
+ overflow-wrap: anywhere;
2499
+ }
2500
+
2501
+ .taskon-withdraw-notice__loading {
2502
+ margin-top: 14px;
2503
+ display: flex;
2504
+ justify-content: center;
2505
+ }
2506
+
2507
+ .taskon-withdraw-notice__spinner {
2508
+ width: 36px;
2509
+ height: 36px;
2510
+ border-radius: 50%;
2511
+ border: 3px solid var(--taskon-color-border);
2512
+ border-top-color: var(--taskon-color-primary);
2513
+ animation: taskon-withdraw-notice-spin 0.8s linear infinite;
2514
+ }
2515
+
2516
+ .taskon-withdraw-notice__tx-hash {
2517
+ margin: 12px 0 0;
2518
+ font-size: var(--taskon-font-size-sm);
2519
+ color: var(--taskon-color-text-secondary);
2520
+ word-break: break-all;
2521
+ }
2522
+
2523
+ .taskon-withdraw-notice__actions {
2524
+ display: flex;
2525
+ align-items: center;
2526
+ gap: 10px;
2527
+ width: 100%;
2528
+ }
2529
+
2530
+ .taskon-withdraw-notice__action {
2531
+ flex: 1;
2532
+ width: auto;
2533
+ min-width: 0;
2534
+ }
2535
+
2536
+ .taskon-withdraw-notice--cancel .taskon-confirm-notice-buttons {
2537
+ flex-direction: column;
2538
+ align-items: stretch;
2539
+ }
2540
+
2541
+ .taskon-withdraw-notice--cancel .taskon-confirm-notice-button {
2542
+ width: 100%;
2543
+ min-width: 0;
2544
+ }
2545
+
2546
+ @keyframes taskon-withdraw-notice-spin {
2547
+ from {
2548
+ transform: rotate(0deg);
2549
+ }
2550
+ to {
2551
+ transform: rotate(360deg);
2552
+ }
2553
+ }
2554
+
2555
+ @media (max-width: 750px) {
2556
+ .taskon-withdraw-notice__token {
2557
+ padding: 8px 10px;
2558
+ }
2559
+
2560
+ .taskon-withdraw-notice__token-symbol,
2561
+ .taskon-withdraw-notice__token-amount {
2562
+ font-size: var(--taskon-font-size-sm);
2563
+ }
2564
+
2565
+ .taskon-withdraw-notice__actions {
2566
+ flex-direction: column;
2567
+ align-items: stretch;
2568
+ }
2569
+
2570
+ .taskon-withdraw-notice__action {
2571
+ width: 100%;
2572
+ }
2573
+ }
2574
+
2575
+ @media (min-width: 751px) {
2576
+ .taskon-withdraw-notice--cancel .taskon-confirm-notice-buttons {
2577
+ flex-direction: row;
2578
+ align-items: center;
2579
+ }
2580
+
2581
+ .taskon-withdraw-notice--cancel .taskon-confirm-notice-button {
2582
+ width: auto;
2583
+ min-width: 161px;
2584
+ }
2585
+ }
2586
+ /**
2587
+ * UserCenter Widget 样式
2588
+ *
2589
+ * BEM 命名规范: .taskon-user-center-[block]__[element]--[modifier]
2590
+ *
2591
+ * 基于 Figma UserCenter 设计规范 (暗色模式)
2592
+ * https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4000-1693
2593
+ */
2594
+
2595
+ /* ========== 容器 ========== */
2596
+
2597
+ .taskon-user-center {
2598
+ display: flex;
2599
+ flex-direction: column;
2600
+ gap: var(--taskon-spacing-lg);
2601
+ color: var(--taskon-color-text);
2602
+ background-color: var(--taskon-color-bg-canvas);
2603
+ border-radius: var(--taskon-border-radius);
2604
+ padding: var(--taskon-spacing-lg);
2605
+ }
2606
+
2607
+ .taskon-user-center--error {
2608
+ border: 1px solid var(--taskon-color-error);
2609
+ }
2610
+
2611
+ /* 旧 Tab 栏样式已移除,使用通用 Tabs 组件 */
2612
+
2613
+ /* ========== 内容区域 ========== */
2614
+
2615
+ .taskon-user-center-content {
2616
+ min-height: 200px;
2617
+ }
2618
+
2619
+ /* ========== UserCenter 作用域下的共享 Table 主题覆盖 ========== */
2620
+
2621
+ .taskon-user-center .taskon-table__header {
2622
+ color: var(--taskon-color-text-secondary);
2623
+ background-color: var(--taskon-color-bg-surface-subtle);
2624
+ }
2625
+
2626
+ .taskon-user-center .taskon-table--bordered .taskon-table__row td {
2627
+ border-top: 1px solid var(--taskon-color-border-secondary);
2628
+ border-bottom: 1px solid var(--taskon-color-border-secondary);
2629
+ }
2630
+
2631
+ .taskon-user-center .taskon-table__row:hover {
2632
+ background-color: var(--taskon-color-bg-surface-strong);
2633
+ }
2634
+
2635
+ .taskon-user-center .taskon-table--striped .taskon-table__row:nth-child(even) {
2636
+ background-color: var(--taskon-color-bg-surface-subtle);
2637
+ }
2638
+
2639
+ .taskon-user-center .taskon-table__row--highlighted,
2640
+ .taskon-user-center .taskon-table__row--highlighted:hover {
2641
+ background-color: var(--taskon-color-primary-bg);
2642
+ }
2643
+
2644
+ .taskon-user-center .taskon-table__cell,
2645
+ .taskon-user-center .taskon-table__empty-title {
2646
+ color: var(--taskon-color-text);
2647
+ }
2648
+
2649
+ .taskon-user-center .taskon-table__loading,
2650
+ .taskon-user-center .taskon-table__empty,
2651
+ .taskon-user-center .taskon-table__empty-desc {
2652
+ color: var(--taskon-color-text-disabled);
2653
+ }
2654
+
2655
+ .taskon-user-center .taskon-table__loading-spinner {
2656
+ border: 2px solid var(--taskon-color-border);
2657
+ border-top-color: var(--taskon-color-primary);
2658
+ }
2659
+
2660
+ .taskon-user-center .taskon-table__loading-overlay {
2661
+ background-color: var(--taskon-color-bg-mask);
2662
+ }
2663
+
2664
+ /* ========== 空状态 ========== */
2665
+
2666
+ .taskon-user-center-empty {
2667
+ display: flex;
2668
+ flex-direction: column;
2669
+ align-items: center;
2670
+ justify-content: center;
2671
+ padding: var(--taskon-spacing-xl);
2672
+ text-align: center;
2673
+ }
2674
+
2675
+ .taskon-user-center-empty__icon {
2676
+ margin-bottom: var(--taskon-spacing-md);
2677
+ color: var(--taskon-color-text-disabled);
2678
+ }
2679
+
2680
+ .taskon-user-center-empty__message {
2681
+ font-size: var(--taskon-font-size);
2682
+ color: var(--taskon-color-text-disabled);
2683
+ margin: 0;
2684
+ }
2685
+
2686
+ /* ========== 加载状态 ========== */
2687
+
2688
+ .taskon-user-center-loading {
2689
+ display: flex;
2690
+ flex-direction: column;
2691
+ align-items: center;
2692
+ justify-content: center;
2693
+ padding: var(--taskon-spacing-xl);
2694
+ }
2695
+
2696
+ .taskon-user-center-loading__spinner {
2697
+ width: 32px;
2698
+ height: 32px;
2699
+ border: 3px solid var(--taskon-color-border);
2700
+ border-top-color: var(--taskon-color-text);
2701
+ border-radius: 50%;
2702
+ animation: taskon-spin 1s linear infinite;
2703
+ }
2704
+
2705
+ @keyframes taskon-spin {
2706
+ to {
2707
+ transform: rotate(360deg);
2708
+ }
2709
+ }
2710
+
2711
+ .taskon-user-center-loading__message {
2712
+ margin-top: var(--taskon-spacing-md);
2713
+ font-size: var(--taskon-font-size);
2714
+ color: var(--taskon-color-text-disabled);
2715
+ }
2716
+
2717
+ /* ========== 分页器 (基于 Figma 设计) ========== */
2718
+
2719
+ .taskon-user-center-pagination {
2720
+ display: flex;
2721
+ align-items: center;
2722
+ justify-content: center;
2723
+ gap: var(--taskon-spacing-md);
2724
+ margin-top: var(--taskon-spacing-xl);
2725
+ }
2726
+
2727
+ .taskon-user-center-pagination__arrow {
2728
+ width: 30px;
2729
+ height: 30px;
2730
+ display: flex;
2731
+ align-items: center;
2732
+ justify-content: center;
2733
+ background: transparent;
2734
+ border: none;
2735
+ cursor: pointer;
2736
+ color: var(--taskon-color-text);
2737
+ transition: opacity 0.2s ease;
2738
+ }
2739
+
2740
+ .taskon-user-center-pagination__arrow:disabled {
2741
+ opacity: 0.3;
2742
+ cursor: not-allowed;
2743
+ }
2744
+
2745
+ .taskon-user-center-pagination__arrow svg {
2746
+ width: 24px;
2747
+ height: 24px;
2748
+ }
2749
+
2750
+ .taskon-user-center-pagination__info {
2751
+ font-size: var(--taskon-font-size-lg);
2752
+ font-weight: 400;
2753
+ color: var(--taskon-color-text);
2754
+ text-transform: capitalize;
2755
+ }
2756
+
2757
+ .taskon-user-center-pagination__info-current {
2758
+ color: var(--taskon-color-text);
2759
+ }
2760
+
2761
+ .taskon-user-center-pagination__info-total {
2762
+ color: var(--taskon-color-text-disabled);
2763
+ }
2764
+
2765
+ .taskon-user-center-pagination__info {
2766
+ font-size: var(--taskon-font-size);
2767
+ color: var(--taskon-color-text-secondary);
2768
+ }
2769
+
2770
+ /* ========== 错误状态 ========== */
2771
+
2772
+ .taskon-user-center-error {
2773
+ display: flex;
2774
+ flex-direction: column;
2775
+ align-items: center;
2776
+ justify-content: center;
2777
+ padding: var(--taskon-spacing-xl);
2778
+ text-align: center;
2779
+ }
2780
+
2781
+ .taskon-user-center-error__message {
2782
+ font-size: var(--taskon-font-size);
2783
+ color: var(--taskon-color-error);
2784
+ margin-bottom: var(--taskon-spacing-md);
2785
+ overflow-wrap: anywhere;
2786
+ word-break: break-word;
2787
+ }
2788
+
2789
+ .taskon-user-center-error__retry {
2790
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-lg);
2791
+ font-size: var(--taskon-font-size);
2792
+ color: var(--taskon-color-text-on-primary);
2793
+ background-color: var(--taskon-color-primary);
2794
+ border: none;
2795
+ border-radius: var(--taskon-border-radius-sm);
2796
+ cursor: pointer;
2797
+ transition: background-color 0.2s ease;
2798
+ }
2799
+
2800
+ .taskon-user-center-error__retry:hover {
2801
+ background-color: var(--taskon-color-primary-active);
2802
+ }
2803
+
2804
+ /* ========== Activity History ========== */
2805
+
2806
+ .taskon-activity-history {
2807
+ width: 100%;
2808
+ }
2809
+
2810
+ /* 自定义单元格样式(配合公共 Table 组件使用) */
2811
+
2812
+ .taskon-activity-history__name-cell {
2813
+ display: flex;
2814
+ flex-direction: column;
2815
+ align-items: flex-start;
2816
+ gap: 4px;
2817
+ }
2818
+
2819
+ .taskon-activity-history__cell--name {
2820
+ /* 名称列自动扩展 */
2821
+ }
2822
+
2823
+ .taskon-activity-history__cell--time {
2824
+ font-size: var(--taskon-font-size-sm);
2825
+ color: var(--taskon-color-text-disabled);
2826
+ }
2827
+
2828
+ .taskon-activity-history__campaign-name {
2829
+ font-size: var(--taskon-font-size);
2830
+ font-weight: 500;
2831
+ color: var(--taskon-color-text);
2832
+ word-break: break-word;
2833
+ }
2834
+
2835
+ .taskon-activity-history__campaign-type {
2836
+ font-size: var(--taskon-font-size-sm);
2837
+ color: var(--taskon-color-text-disabled);
2838
+ padding: 2px 6px;
2839
+ background-color: var(--taskon-color-bg-surface-subtle);
2840
+ border-radius: 4px;
2841
+ }
2842
+
2843
+ .taskon-activity-history__load-more {
2844
+ display: flex;
2845
+ justify-content: center;
2846
+ margin-top: var(--taskon-spacing-md);
2847
+ }
2848
+
2849
+ .taskon-activity-history__load-more-btn {
2850
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-lg);
2851
+ font-size: var(--taskon-font-size);
2852
+ color: var(--taskon-color-primary);
2853
+ background: transparent;
2854
+ border: 1px solid var(--taskon-color-primary);
2855
+ border-radius: var(--taskon-border-radius-sm);
2856
+ cursor: pointer;
2857
+ transition: all 0.2s ease;
2858
+ }
2859
+
2860
+ .taskon-activity-history__load-more-btn:hover:not(:disabled) {
2861
+ background-color: var(--taskon-color-primary);
2862
+ color: var(--taskon-color-text-on-primary);
2863
+ }
2864
+
2865
+ .taskon-activity-history__load-more-btn:disabled {
2866
+ opacity: 0.5;
2867
+ cursor: not-allowed;
2868
+ }
2869
+
2870
+ .taskon-activity-history__loading-more {
2871
+ display: flex;
2872
+ justify-content: center;
2873
+ padding: var(--taskon-spacing-md);
2874
+ }
2875
+
2876
+ /* ========== Asset Carousel ========== */
2877
+
2878
+ .taskon-asset-carousel {
2879
+ position: relative;
2880
+ display: flex;
2881
+ flex-direction: column;
2882
+ gap: var(--taskon-spacing-md);
2883
+ margin-bottom: var(--taskon-spacing-xl);
2884
+ }
2885
+
2886
+ /* "You have earned" 标题 */
2887
+
2888
+ .taskon-asset-carousel__title {
2889
+ font-size: var(--taskon-font-size-lg);
2890
+ font-weight: 600;
2891
+ line-height: 1.5;
2892
+ color: var(--taskon-color-text);
2893
+ }
2894
+
2895
+ .taskon-asset-carousel--empty {
2896
+ display: none;
2897
+ }
2898
+
2899
+ .taskon-asset-carousel__container {
2900
+ display: flex;
2901
+ flex-wrap: wrap;
2902
+ gap: var(--taskon-spacing-sm);
2903
+ }
2904
+
2905
+ .taskon-asset-carousel__container::-webkit-scrollbar {
2906
+ display: none;
2907
+ }
2908
+
2909
+ /* 隐藏滚动箭头(改用 wrap 布局不需要箭头) */
2910
+
2911
+ .taskon-asset-carousel__arrow {
2912
+ display: none;
2913
+ }
2914
+
2915
+ /* ========== Asset Card (基于 Figma 暗色模式设计) ========== */
2916
+
2917
+ .taskon-asset-card {
2918
+ display: flex;
2919
+ flex-direction: column;
2920
+ gap: var(--taskon-spacing-md);
2921
+ flex: 1 0 0;
2922
+ min-width: 120px;
2923
+ padding: var(--taskon-spacing-md);
2924
+ background: var(--taskon-color-bg-surface-strong);
2925
+ border: 1px solid var(--taskon-color-border-secondary);
2926
+ border-radius: var(--taskon-border-radius);
2927
+ cursor: pointer;
2928
+ transition: all 0.2s ease;
2929
+ }
2930
+
2931
+ .taskon-asset-card:hover {
2932
+ border-color: var(--taskon-color-border);
2933
+ }
2934
+
2935
+ .taskon-asset-card--selected {
2936
+ border-color: var(--taskon-color-text-tertiary);
2937
+ }
2938
+
2939
+ /* 图标容器 - 默认深色背景 */
2940
+
2941
+ .taskon-asset-card__icon {
2942
+ display: flex;
2943
+ align-items: center;
2944
+ justify-content: center;
2945
+ width: 48px;
2946
+ height: 48px;
2947
+ border-radius: 50%;
2948
+ background-color: var(--taskon-color-bg-surface-strong);
2949
+ color: var(--taskon-color-text);
2950
+ flex-shrink: 0;
2951
+ }
2952
+
2953
+ /* Whitelist 图标使用白色背景 */
2954
+
2955
+ .taskon-asset-card__icon--light {
2956
+ background-color: var(--taskon-color-text);
2957
+ }
2958
+
2959
+ .taskon-asset-card__icon-img {
2960
+ width: 48px;
2961
+ height: 48px;
2962
+ border-radius: 50%;
2963
+ object-fit: cover;
2964
+ }
2965
+
2966
+ /* Whitelist "WL" 文字图标样式 - 基于 Figma 设计 */
2967
+
2968
+ .taskon-asset-card__icon-wl {
2969
+ font-size: var(--taskon-font-size-xl);
2970
+ font-weight: 900;
2971
+ letter-spacing: 0.6933px;
2972
+ color: var(--taskon-color-bg-canvas);
2973
+ line-height: 1;
2974
+ }
2975
+
2976
+ /* NFT 文字图标样式 - 基于 Figma 设计 */
2977
+
2978
+ .taskon-asset-card__icon-nft {
2979
+ font-size: var(--taskon-font-size-sm);
2980
+ font-weight: 700;
2981
+ letter-spacing: 0.5px;
2982
+ color: var(--taskon-color-text);
2983
+ line-height: 1;
2984
+ }
2985
+
2986
+ /* 内容区域 */
2987
+
2988
+ .taskon-asset-card__content {
2989
+ display: flex;
2990
+ flex-direction: column;
2991
+ gap: var(--taskon-spacing-xs);
2992
+ align-items: flex-start;
2993
+ text-align: left;
2994
+ }
2995
+
2996
+ /* 标题(如 Token, NFT) */
2997
+
2998
+ .taskon-asset-card__title {
2999
+ font-size: var(--taskon-font-size);
3000
+ font-weight: 500;
3001
+ line-height: 1.43;
3002
+ color: var(--taskon-color-text-disabled);
3003
+ }
3004
+
3005
+ /* 数值(如 $17,545) */
3006
+
3007
+ .taskon-asset-card__value {
3008
+ font-size: 20px;
3009
+ font-weight: 600;
3010
+ line-height: 1.4;
3011
+ color: var(--taskon-color-text);
3012
+ }
3013
+
3014
+ /* ========== My Rewards Content (基于 Figma 暗色模式设计) ========== */
3015
+
3016
+ .taskon-my-rewards {
3017
+ width: 100%;
3018
+ display: flex;
3019
+ flex-direction: column;
3020
+ gap: var(--taskon-spacing-xl);
3021
+ }
3022
+
3023
+ .taskon-my-rewards__section {
3024
+ display: flex;
3025
+ flex-direction: column;
3026
+ gap: var(--taskon-spacing-md);
3027
+ }
3028
+
3029
+ .taskon-my-rewards__section:last-child {
3030
+ margin-bottom: 0;
3031
+ }
3032
+
3033
+ .taskon-my-rewards__section-title {
3034
+ font-size: var(--taskon-font-size-lg);
3035
+ font-weight: 600;
3036
+ line-height: 1.5;
3037
+ color: var(--taskon-color-text);
3038
+ }
3039
+
3040
+ /* ========== Token Asset List (使用通用 Table 组件) ========== */
3041
+
3042
+ .taskon-token-assets {
3043
+ width: 100%;
3044
+ display: flex;
3045
+ flex-direction: column;
3046
+ }
3047
+
3048
+ /* ========== WithdrawPending 组件(参考 Vue 版本 WithdrawPending.vue) ========== */
3049
+
3050
+ .taskon-withdraw-pending {
3051
+ display: flex;
3052
+ align-items: center;
3053
+ justify-content: space-between;
3054
+ gap: 40px;
3055
+ padding: 12px 24px;
3056
+ margin-bottom: var(--taskon-spacing-sm);
3057
+ background-color: var(--taskon-color-secondary-bg);
3058
+ border-radius: var(--taskon-border-radius-sm);
3059
+ font-weight: 500;
3060
+ color: var(--taskon-color-text);
3061
+ cursor: pointer;
3062
+ transition: background-color 0.2s ease;
3063
+ }
3064
+
3065
+ .taskon-withdraw-pending:hover {
3066
+ background-color: var(--taskon-color-bg-surface-strong);
3067
+ }
3068
+
3069
+ .taskon-withdraw-pending__left {
3070
+ display: flex;
3071
+ align-items: center;
3072
+ gap: 8px;
3073
+ }
3074
+
3075
+ /* 数字徽章 */
3076
+
3077
+ .taskon-withdraw-pending__count {
3078
+ padding: 4px 8px;
3079
+ font-size: var(--taskon-font-size);
3080
+ line-height: 1;
3081
+ text-align: right;
3082
+ white-space: nowrap;
3083
+ background-color: var(--taskon-color-bg-inset);
3084
+ border-radius: var(--taskon-border-radius-sm);
3085
+ }
3086
+
3087
+ /* 提示文字 */
3088
+
3089
+ .taskon-withdraw-pending__text {
3090
+ font-size: var(--taskon-font-size-lg);
3091
+ white-space: nowrap;
3092
+ }
3093
+
3094
+ /* 箭头图标 */
3095
+
3096
+ .taskon-withdraw-pending__arrow {
3097
+ flex-shrink: 0;
3098
+ color: var(--taskon-color-text);
3099
+ }
3100
+
3101
+ /* Token Symbol 单元格 */
3102
+
3103
+ .taskon-token-assets__symbol-cell {
3104
+ display: flex;
3105
+ align-items: center;
3106
+ gap: var(--taskon-spacing-sm);
3107
+ }
3108
+
3109
+ /* Network 单元格 */
3110
+
3111
+ .taskon-token-assets__network-cell {
3112
+ display: flex;
3113
+ align-items: center;
3114
+ gap: var(--taskon-spacing-sm);
3115
+ }
3116
+
3117
+ /* Token 图标 */
3118
+
3119
+ .taskon-token-assets__token-icon {
3120
+ width: 24px;
3121
+ height: 24px;
3122
+ border-radius: 50%;
3123
+ object-fit: cover;
3124
+ flex-shrink: 0;
3125
+ }
3126
+
3127
+ /* 链图标 */
3128
+
3129
+ .taskon-token-assets__chain-icon {
3130
+ width: 24px;
3131
+ height: 24px;
3132
+ border-radius: 50%;
3133
+ object-fit: cover;
3134
+ flex-shrink: 0;
3135
+ }
3136
+
3137
+ /* Token 符号 */
3138
+
3139
+ .taskon-token-assets__symbol {
3140
+ font-size: var(--taskon-font-size);
3141
+ font-weight: 400;
3142
+ line-height: normal;
3143
+ color: var(--taskon-color-text);
3144
+ text-transform: capitalize;
3145
+ }
3146
+
3147
+ /* 链名称 */
3148
+
3149
+ .taskon-token-assets__chain {
3150
+ font-size: var(--taskon-font-size);
3151
+ font-weight: 400;
3152
+ line-height: normal;
3153
+ color: var(--taskon-color-text);
3154
+ text-transform: capitalize;
3155
+ }
3156
+
3157
+ /* 余额 */
3158
+
3159
+ .taskon-token-assets__balance {
3160
+ font-size: var(--taskon-font-size);
3161
+ font-weight: 400;
3162
+ line-height: normal;
3163
+ color: var(--taskon-color-text);
3164
+ text-overflow: ellipsis;
3165
+ overflow: hidden;
3166
+ white-space: nowrap;
3167
+ }
3168
+
3169
+ /* 冻结资产入口按钮 */
3170
+
3171
+ .taskon-token-assets__frozen-btn {
3172
+ padding: 0;
3173
+ border: none;
3174
+ background: transparent;
3175
+ color: var(--taskon-color-text);
3176
+ text-decoration: underline;
3177
+ cursor: pointer;
3178
+ font-size: var(--taskon-font-size);
3179
+ font-weight: 500;
3180
+ }
3181
+
3182
+ .taskon-token-assets__frozen-btn:hover {
3183
+ color: var(--taskon-color-text-secondary);
3184
+ }
3185
+
3186
+ /* 提现按钮(覆盖通用 Button 样式以匹配设计) */
3187
+
3188
+ .taskon-token-assets__withdraw-btn {
3189
+ min-width: auto;
3190
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md) !important;
3191
+ height: 34px !important;
3192
+ border-color: var(--taskon-color-border) !important;
3193
+ }
3194
+
3195
+ .taskon-token-assets__withdraw-btn:hover:not(:disabled) {
3196
+ border-color: var(--taskon-color-text-tertiary) !important;
3197
+ }
3198
+
3199
+ /* ========== Reward Detail List ========== */
3200
+
3201
+ .taskon-reward-detail {
3202
+ width: 100%;
3203
+ }
3204
+
3205
+ .taskon-reward-detail__list {
3206
+ display: flex;
3207
+ flex-direction: column;
3208
+ border: 1px solid var(--taskon-color-border);
3209
+ border-radius: var(--taskon-border-radius-sm);
3210
+ overflow: hidden;
3211
+ }
3212
+
3213
+ .taskon-reward-detail__row {
3214
+ display: flex;
3215
+ align-items: center;
3216
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
3217
+ border-bottom: 1px solid var(--taskon-color-border);
3218
+ transition: background-color 0.2s ease;
3219
+ }
3220
+
3221
+ .taskon-reward-detail__row:last-child {
3222
+ border-bottom: none;
3223
+ }
3224
+
3225
+ .taskon-reward-detail__row:hover {
3226
+ background-color: var(--taskon-color-bg-surface-strong);
3227
+ }
3228
+
3229
+ .taskon-reward-detail__row[role="button"] {
3230
+ cursor: pointer;
3231
+ }
3232
+
3233
+ .taskon-reward-detail__row--nft {
3234
+ padding: var(--taskon-spacing-md);
3235
+ }
3236
+
3237
+ .taskon-reward-detail__cell {
3238
+ display: flex;
3239
+ align-items: center;
3240
+ }
3241
+
3242
+ .taskon-reward-detail__cell--icon {
3243
+ width: 32px;
3244
+ margin-right: var(--taskon-spacing-sm);
3245
+ }
3246
+
3247
+ .taskon-reward-detail__cell--nft-image {
3248
+ width: 60px;
3249
+ margin-right: var(--taskon-spacing-md);
3250
+ }
3251
+
3252
+ .taskon-reward-detail__cell--main {
3253
+ flex: 1;
3254
+ display: flex;
3255
+ flex-direction: column;
3256
+ gap: 2px;
3257
+ overflow: hidden;
3258
+ }
3259
+
3260
+ .taskon-reward-detail__cell--time {
3261
+ font-size: var(--taskon-font-size-sm);
3262
+ color: var(--taskon-color-text-secondary);
3263
+ white-space: nowrap;
3264
+ }
3265
+
3266
+ .taskon-reward-detail__cell--action {
3267
+ margin-left: var(--taskon-spacing-md);
3268
+ }
3269
+
3270
+ .taskon-reward-detail__token-icon {
3271
+ width: 32px;
3272
+ height: 32px;
3273
+ border-radius: 50%;
3274
+ object-fit: cover;
3275
+ }
3276
+
3277
+ .taskon-reward-detail__nft-image {
3278
+ width: 60px;
3279
+ height: 60px;
3280
+ border-radius: var(--taskon-border-radius-sm);
3281
+ object-fit: cover;
3282
+ }
3283
+
3284
+ .taskon-reward-detail__primary {
3285
+ font-size: var(--taskon-font-size);
3286
+ font-weight: 500;
3287
+ color: var(--taskon-color-text);
3288
+ white-space: nowrap;
3289
+ overflow: hidden;
3290
+ text-overflow: ellipsis;
3291
+ }
3292
+
3293
+ .taskon-reward-detail__secondary {
3294
+ font-size: var(--taskon-font-size-sm);
3295
+ color: var(--taskon-color-text-secondary);
3296
+ white-space: nowrap;
3297
+ overflow: hidden;
3298
+ text-overflow: ellipsis;
3299
+ }
3300
+
3301
+ .taskon-reward-detail__claim-btn {
3302
+ padding: var(--taskon-spacing-xs) var(--taskon-spacing-md);
3303
+ font-size: var(--taskon-font-size);
3304
+ font-weight: 500;
3305
+ color: var(--taskon-color-text-on-primary);
3306
+ background-color: var(--taskon-color-primary);
3307
+ border: none;
3308
+ border-radius: var(--taskon-border-radius-sm);
3309
+ cursor: pointer;
3310
+ transition: background-color 0.2s ease;
3311
+ }
3312
+
3313
+ .taskon-reward-detail__claim-btn:hover {
3314
+ background-color: var(--taskon-color-primary-active);
3315
+ }
3316
+
3317
+ .taskon-reward-detail__claimed {
3318
+ font-size: var(--taskon-font-size);
3319
+ color: var(--taskon-color-success);
3320
+ }
3321
+
3322
+ .taskon-reward-detail__loading-more {
3323
+ display: flex;
3324
+ justify-content: center;
3325
+ padding: var(--taskon-spacing-md);
3326
+ }
3327
+
3328
+ /* ========== Withdraw Modal ========== */
3329
+
3330
+ .taskon-withdraw-modal {
3331
+ position: fixed;
3332
+ inset: 0;
3333
+ z-index: 1000;
3334
+ display: flex;
3335
+ align-items: center;
3336
+ justify-content: center;
3337
+ }
3338
+
3339
+ .taskon-withdraw-modal__overlay {
3340
+ position: absolute;
3341
+ inset: 0;
3342
+ background-color: var(--taskon-color-bg-mask);
3343
+ }
3344
+
3345
+ .taskon-withdraw-modal__content {
3346
+ position: relative;
3347
+ width: 90%;
3348
+ max-width: 400px;
3349
+ max-height: 90vh;
3350
+ background-color: var(--taskon-color-bg-surface);
3351
+ border-radius: var(--taskon-border-radius);
3352
+ box-shadow: 0 20px 25px -5px var(--taskon-color-bg-mask);
3353
+ overflow: hidden;
3354
+ display: flex;
3355
+ flex-direction: column;
3356
+ }
3357
+
3358
+ .taskon-withdraw-modal__header {
3359
+ display: flex;
3360
+ align-items: center;
3361
+ justify-content: space-between;
3362
+ padding: var(--taskon-spacing-md) var(--taskon-spacing-lg);
3363
+ border-bottom: 1px solid var(--taskon-color-border);
3364
+ }
3365
+
3366
+ .taskon-withdraw-modal__title {
3367
+ font-size: var(--taskon-font-size-xl);
3368
+ font-weight: 600;
3369
+ color: var(--taskon-color-text);
3370
+ margin: 0;
3371
+ }
3372
+
3373
+ .taskon-withdraw-modal__close {
3374
+ display: flex;
3375
+ align-items: center;
3376
+ justify-content: center;
3377
+ padding: 4px;
3378
+ background: none;
3379
+ border: none;
3380
+ color: var(--taskon-color-text-secondary);
3381
+ cursor: pointer;
3382
+ transition: color 0.2s ease;
3383
+ }
3384
+
3385
+ .taskon-withdraw-modal__close:hover:not(:disabled) {
3386
+ color: var(--taskon-color-text);
3387
+ }
3388
+
3389
+ .taskon-withdraw-modal__close:disabled {
3390
+ opacity: 0.5;
3391
+ cursor: not-allowed;
3392
+ }
3393
+
3394
+ .taskon-withdraw-modal__body {
3395
+ padding: var(--taskon-spacing-lg);
3396
+ overflow-y: auto;
3397
+ }
3398
+
3399
+ .taskon-withdraw-modal__icon {
3400
+ display: flex;
3401
+ justify-content: center;
3402
+ margin-bottom: var(--taskon-spacing-md);
3403
+ }
3404
+
3405
+ .taskon-withdraw-modal__icon--success {
3406
+ color: var(--taskon-color-success);
3407
+ }
3408
+
3409
+ .taskon-withdraw-modal__icon--warning {
3410
+ color: var(--taskon-color-warning);
3411
+ }
3412
+
3413
+ .taskon-withdraw-modal__message {
3414
+ font-size: var(--taskon-font-size);
3415
+ color: var(--taskon-color-text);
3416
+ text-align: center;
3417
+ margin: 0;
3418
+ }
3419
+
3420
+ .taskon-withdraw-modal__tx-hash {
3421
+ font-size: var(--taskon-font-size-sm);
3422
+ color: var(--taskon-color-text-secondary);
3423
+ text-align: center;
3424
+ margin-top: var(--taskon-spacing-sm);
3425
+ word-break: break-all;
3426
+ }
3427
+
3428
+ .taskon-withdraw-modal__tokens {
3429
+ display: flex;
3430
+ flex-direction: column;
3431
+ gap: var(--taskon-spacing-sm);
3432
+ }
3433
+
3434
+ .taskon-withdraw-modal__token-item {
3435
+ display: flex;
3436
+ align-items: center;
3437
+ justify-content: space-between;
3438
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
3439
+ background-color: var(--taskon-color-bg-surface-subtle);
3440
+ border-radius: var(--taskon-border-radius-sm);
3441
+ }
3442
+
3443
+ .taskon-withdraw-modal__token-info {
3444
+ display: flex;
3445
+ align-items: center;
3446
+ gap: var(--taskon-spacing-sm);
3447
+ }
3448
+
3449
+ .taskon-withdraw-modal__token-icon {
3450
+ width: 32px;
3451
+ height: 32px;
3452
+ border-radius: 50%;
3453
+ object-fit: cover;
3454
+ }
3455
+
3456
+ .taskon-withdraw-modal__token-details {
3457
+ display: flex;
3458
+ flex-direction: column;
3459
+ gap: 2px;
3460
+ }
3461
+
3462
+ .taskon-withdraw-modal__token-symbol {
3463
+ font-size: var(--taskon-font-size);
3464
+ font-weight: 500;
3465
+ color: var(--taskon-color-text);
3466
+ }
3467
+
3468
+ .taskon-withdraw-modal__token-chain {
3469
+ font-size: var(--taskon-font-size-sm);
3470
+ color: var(--taskon-color-text-secondary);
3471
+ }
3472
+
3473
+ .taskon-withdraw-modal__token-amount {
3474
+ font-size: var(--taskon-font-size-lg);
3475
+ font-weight: 600;
3476
+ color: var(--taskon-color-text);
3477
+ }
3478
+
3479
+ .taskon-withdraw-modal__error {
3480
+ margin-top: var(--taskon-spacing-md);
3481
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
3482
+ font-size: var(--taskon-font-size);
3483
+ color: var(--taskon-color-error);
3484
+ background-color: var(--taskon-color-error-bg);
3485
+ border-radius: var(--taskon-border-radius-sm);
3486
+ overflow-wrap: anywhere;
3487
+ word-break: break-word;
3488
+ }
3489
+
3490
+ .taskon-withdraw-confirm__error {
3491
+ margin-top: var(--taskon-spacing-md);
3492
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
3493
+ font-size: var(--taskon-font-size);
3494
+ color: var(--taskon-color-error);
3495
+ background-color: var(--taskon-color-error-bg);
3496
+ border-radius: var(--taskon-border-radius-sm);
3497
+ overflow-wrap: anywhere;
3498
+ word-break: break-word;
3499
+ }
3500
+
3501
+ .taskon-withdraw-modal__footer {
3502
+ display: flex;
3503
+ gap: var(--taskon-spacing-sm);
3504
+ padding: var(--taskon-spacing-md) var(--taskon-spacing-lg);
3505
+ border-top: 1px solid var(--taskon-color-border);
3506
+ }
3507
+
3508
+ .taskon-withdraw-modal__btn {
3509
+ flex: 1;
3510
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-lg);
3511
+ font-size: var(--taskon-font-size);
3512
+ font-weight: 500;
3513
+ border: none;
3514
+ border-radius: var(--taskon-border-radius-sm);
3515
+ cursor: pointer;
3516
+ transition: all 0.2s ease;
3517
+ }
3518
+
3519
+ .taskon-withdraw-modal__btn--primary {
3520
+ color: var(--taskon-color-text-on-primary);
3521
+ background-color: var(--taskon-color-primary);
3522
+ }
3523
+
3524
+ .taskon-withdraw-modal__btn--primary:hover:not(:disabled) {
3525
+ background-color: var(--taskon-color-primary-active);
3526
+ }
3527
+
3528
+ .taskon-withdraw-modal__btn--secondary {
3529
+ color: var(--taskon-color-text);
3530
+ background-color: var(--taskon-color-bg-surface-subtle);
3531
+ }
3532
+
3533
+ .taskon-withdraw-modal__btn--secondary:hover:not(:disabled) {
3534
+ background-color: var(--taskon-color-bg-surface-strong);
3535
+ }
3536
+
3537
+ .taskon-withdraw-modal__btn:disabled {
3538
+ opacity: 0.5;
3539
+ cursor: not-allowed;
3540
+ }
3541
+
3542
+ .taskon-withdraw-modal__loading {
3543
+ display: flex;
3544
+ align-items: center;
3545
+ justify-content: center;
3546
+ gap: var(--taskon-spacing-sm);
3547
+ }
3548
+
3549
+ .taskon-withdraw-modal__spinner {
3550
+ width: 16px;
3551
+ height: 16px;
3552
+ border: 2px solid var(--taskon-color-border);
3553
+ border-top-color: var(--taskon-color-text-on-primary);
3554
+ border-radius: 50%;
3555
+ animation: taskon-spin 1s linear infinite;
3556
+ }
3557
+
3558
+ /* ========== Frozen Asset List ========== */
3559
+
3560
+ .taskon-frozen-assets {
3561
+ width: 100%;
3562
+ }
3563
+
3564
+ .taskon-frozen-assets__header {
3565
+ display: flex;
3566
+ align-items: center;
3567
+ justify-content: space-between;
3568
+ margin-bottom: var(--taskon-spacing-md);
3569
+ }
3570
+
3571
+ .taskon-frozen-assets__title {
3572
+ font-size: var(--taskon-font-size-lg);
3573
+ font-weight: 600;
3574
+ color: var(--taskon-color-text);
3575
+ margin: 0;
3576
+ }
3577
+
3578
+ .taskon-frozen-assets__close {
3579
+ display: flex;
3580
+ align-items: center;
3581
+ justify-content: center;
3582
+ padding: 4px;
3583
+ background: none;
3584
+ border: none;
3585
+ color: var(--taskon-color-text-secondary);
3586
+ cursor: pointer;
3587
+ transition: color 0.2s ease;
3588
+ }
3589
+
3590
+ .taskon-frozen-assets__close:hover {
3591
+ color: var(--taskon-color-text);
3592
+ }
3593
+
3594
+ .taskon-frozen-assets__list {
3595
+ display: flex;
3596
+ flex-direction: column;
3597
+ gap: var(--taskon-spacing-sm);
3598
+ }
3599
+
3600
+ .taskon-frozen-assets__item {
3601
+ display: flex;
3602
+ align-items: center;
3603
+ justify-content: space-between;
3604
+ padding: var(--taskon-spacing-md);
3605
+ background-color: var(--taskon-color-bg-surface-subtle);
3606
+ border-radius: var(--taskon-border-radius);
3607
+ }
3608
+
3609
+ .taskon-frozen-assets__info {
3610
+ display: flex;
3611
+ flex-direction: column;
3612
+ gap: 4px;
3613
+ }
3614
+
3615
+ .taskon-frozen-assets__details {
3616
+ display: flex;
3617
+ flex-direction: column;
3618
+ gap: 2px;
3619
+ }
3620
+
3621
+ .taskon-frozen-assets__amount {
3622
+ font-size: var(--taskon-font-size-lg);
3623
+ font-weight: 600;
3624
+ color: var(--taskon-color-text);
3625
+ }
3626
+
3627
+ .taskon-frozen-assets__type {
3628
+ font-size: var(--taskon-font-size-sm);
3629
+ color: var(--taskon-color-text-secondary);
3630
+ }
3631
+
3632
+ .taskon-frozen-assets__campaign {
3633
+ font-size: var(--taskon-font-size-sm);
3634
+ color: var(--taskon-color-text-secondary);
3635
+ }
3636
+
3637
+ .taskon-frozen-assets__time {
3638
+ font-size: var(--taskon-font-size-sm);
3639
+ color: var(--taskon-color-text-secondary);
3640
+ }
3641
+
3642
+ .taskon-frozen-assets__resend-btn {
3643
+ padding: var(--taskon-spacing-xs) var(--taskon-spacing-md);
3644
+ font-size: var(--taskon-font-size);
3645
+ color: var(--taskon-color-primary);
3646
+ background: transparent;
3647
+ border: 1px solid var(--taskon-color-primary);
3648
+ border-radius: var(--taskon-border-radius-sm);
3649
+ cursor: pointer;
3650
+ transition: all 0.2s ease;
3651
+ }
3652
+
3653
+ .taskon-frozen-assets__resend-btn:hover {
3654
+ background-color: var(--taskon-color-primary);
3655
+ color: var(--taskon-color-text-on-primary);
3656
+ }
3657
+
3658
+ /* ========== Progress Bar ========== */
3659
+
3660
+ .taskon-progress-bar {
3661
+ width: 100%;
3662
+ }
3663
+
3664
+ .taskon-progress-bar__container {
3665
+ width: 100%;
3666
+ height: 8px;
3667
+ background-color: var(--taskon-color-bg-surface-subtle);
3668
+ border-radius: 9999px;
3669
+ overflow: hidden;
3670
+ }
3671
+
3672
+ .taskon-progress-bar__fill {
3673
+ height: 100%;
3674
+ background-color: var(--taskon-color-primary);
3675
+ border-radius: 9999px;
3676
+ transition: width 0.3s ease;
3677
+ }
3678
+
3679
+ .taskon-progress-bar__info {
3680
+ display: flex;
3681
+ justify-content: space-between;
3682
+ align-items: center;
3683
+ margin-top: var(--taskon-spacing-xs);
3684
+ font-size: var(--taskon-font-size-sm);
3685
+ color: var(--taskon-color-text-secondary);
3686
+ }
3687
+
3688
+ .taskon-progress-bar__values {
3689
+ font-weight: 500;
3690
+ }
3691
+
3692
+ .taskon-progress-bar__percent {
3693
+ font-weight: 600;
3694
+ color: var(--taskon-color-primary);
3695
+ }
3696
+
3697
+ /* ========== XP Level Card ========== */
3698
+
3699
+ .taskon-xp-level-card {
3700
+ width: 100%;
3701
+ }
3702
+
3703
+ .taskon-xp-level-card__header {
3704
+ display: flex;
3705
+ align-items: center;
3706
+ justify-content: space-between;
3707
+ margin-bottom: var(--taskon-spacing-md);
3708
+ }
3709
+
3710
+ .taskon-xp-level-card__level {
3711
+ display: flex;
3712
+ align-items: center;
3713
+ gap: var(--taskon-spacing-sm);
3714
+ }
3715
+
3716
+ .taskon-xp-level-card__level-badge {
3717
+ display: flex;
3718
+ align-items: center;
3719
+ justify-content: center;
3720
+ width: 48px;
3721
+ height: 48px;
3722
+ background: linear-gradient(
3723
+ 135deg,
3724
+ var(--taskon-color-primary),
3725
+ var(--taskon-color-primary-hover)
3726
+ );
3727
+ border-radius: 50%;
3728
+ color: var(--taskon-color-text-on-primary);
3729
+ font-size: var(--taskon-font-size-xl);
3730
+ font-weight: 700;
3731
+ }
3732
+
3733
+ .taskon-xp-level-card__level-info {
3734
+ display: flex;
3735
+ flex-direction: column;
3736
+ gap: 2px;
3737
+ }
3738
+
3739
+ .taskon-xp-level-card__level-label {
3740
+ font-size: var(--taskon-font-size-sm);
3741
+ color: var(--taskon-color-text-secondary);
3742
+ }
3743
+
3744
+ .taskon-xp-level-card__level-value {
3745
+ font-size: 20px;
3746
+ font-weight: 700;
3747
+ color: var(--taskon-color-text);
3748
+ }
3749
+
3750
+ .taskon-xp-level-card__xp {
3751
+ display: flex;
3752
+ flex-direction: column;
3753
+ align-items: flex-end;
3754
+ gap: 2px;
3755
+ }
3756
+
3757
+ .taskon-xp-level-card__xp-label {
3758
+ font-size: var(--taskon-font-size-sm);
3759
+ color: var(--taskon-color-text-secondary);
3760
+ }
3761
+
3762
+ .taskon-xp-level-card__xp-value {
3763
+ font-size: var(--taskon-font-size-xl);
3764
+ font-weight: 600;
3765
+ color: var(--taskon-color-text);
3766
+ }
3767
+
3768
+ .taskon-xp-level-card__progress {
3769
+ margin-bottom: var(--taskon-spacing-lg);
3770
+ }
3771
+
3772
+ .taskon-xp-level-card__progress-label {
3773
+ display: flex;
3774
+ justify-content: space-between;
3775
+ align-items: center;
3776
+ margin-bottom: var(--taskon-spacing-xs);
3777
+ font-size: var(--taskon-font-size-sm);
3778
+ color: var(--taskon-color-text-secondary);
3779
+ }
3780
+
3781
+ .taskon-xp-level-card__history-title {
3782
+ font-size: var(--taskon-font-size-lg);
3783
+ font-weight: 600;
3784
+ color: var(--taskon-color-text);
3785
+ margin-bottom: var(--taskon-spacing-md);
3786
+ }
3787
+
3788
+ /* ============================================================================
3789
+ Identity 组件样式
3790
+ ============================================================================ */
3791
+
3792
+ .taskon-identity {
3793
+ display: flex;
3794
+ flex-direction: column;
3795
+ gap: var(--taskon-spacing-xl);
3796
+ }
3797
+
3798
+ .taskon-identity-loading {
3799
+ display: flex;
3800
+ justify-content: center;
3801
+ align-items: center;
3802
+ padding: var(--taskon-spacing-xl);
3803
+ color: var(--taskon-color-text-tertiary);
3804
+ }
3805
+
3806
+ .taskon-identity-empty {
3807
+ display: flex;
3808
+ justify-content: center;
3809
+ align-items: center;
3810
+ padding: var(--taskon-spacing-xl);
3811
+ color: var(--taskon-color-text-tertiary);
3812
+ font-size: var(--taskon-font-size);
3813
+ }
3814
+
3815
+ /* ============================================================================
3816
+ Social Media Accounts - 基于 Figma 设计
3817
+ https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4024-19730
3818
+ ============================================================================ */
3819
+
3820
+ /* 社交账号区域 */
3821
+
3822
+ .taskon-identity-social-section {
3823
+ display: flex;
3824
+ flex-direction: column;
3825
+ gap: var(--taskon-spacing-md);
3826
+ }
3827
+
3828
+ /* 标题: 24px 加粗白色 */
3829
+
3830
+ .taskon-identity-social-section__title {
3831
+ font-size: var(--taskon-font-size-xxxl);
3832
+ font-weight: 600;
3833
+ line-height: 1.33;
3834
+ color: var(--taskon-color-text);
3835
+ margin: 0;
3836
+ }
3837
+
3838
+ /* 网格布局: 每行最多 3 个,间距 20px */
3839
+
3840
+ .taskon-identity-social-grid {
3841
+ display: flex;
3842
+ flex-wrap: wrap;
3843
+ gap: var(--taskon-spacing-md);
3844
+ }
3845
+
3846
+ /* 社交账号卡片: 305px × 64px */
3847
+
3848
+ .taskon-identity-social-item {
3849
+ display: flex;
3850
+ align-items: center;
3851
+ justify-content: space-between;
3852
+ gap: var(--taskon-spacing-md);
3853
+ width: 305px;
3854
+ height: 64px;
3855
+ padding: var(--taskon-spacing-md);
3856
+ background-color: var(--taskon-color-bg-surface-subtle);
3857
+ border-radius: 10px;
3858
+ box-sizing: border-box;
3859
+ transition: background-color 0.2s ease;
3860
+ }
3861
+
3862
+ .taskon-identity-social-item:hover {
3863
+ background-color: var(--taskon-color-bg-surface-strong);
3864
+ }
3865
+
3866
+ .taskon-identity-social-item--clickable {
3867
+ cursor: pointer;
3868
+ }
3869
+
3870
+ .taskon-identity-social-item--clickable:focus-visible {
3871
+ outline: 2px solid var(--taskon-color-link);
3872
+ outline-offset: 2px;
3873
+ }
3874
+
3875
+ /* 已绑定状态 - 可以添加不同的视觉反馈 */
3876
+
3877
+ .taskon-identity-social-item--bound {
3878
+ background-color: var(--taskon-color-bg-surface-subtle);
3879
+ }
3880
+
3881
+ /* "Linked" 徽章:已绑定默认显示 */
3882
+
3883
+ .taskon-identity-social-item__linked {
3884
+ display: flex;
3885
+ align-items: center;
3886
+ justify-content: center;
3887
+ height: 24px;
3888
+ padding: 0 10px;
3889
+ font-size: var(--taskon-font-size-sm);
3890
+ font-weight: 500;
3891
+ line-height: 1;
3892
+ color: var(--taskon-color-text-tertiary);
3893
+ background-color: var(--taskon-color-border);
3894
+ border-radius: 4px;
3895
+ flex-shrink: 0;
3896
+ white-space: nowrap;
3897
+ }
3898
+
3899
+ /* 解绑关闭按钮(✕):默认隐藏 */
3900
+
3901
+ .taskon-identity-social-item__unlink-btn {
3902
+ display: none;
3903
+ align-items: center;
3904
+ justify-content: center;
3905
+ width: 34px;
3906
+ height: 34px;
3907
+ padding: 0;
3908
+ background-color: var(--taskon-color-error-bg);
3909
+ border: none;
3910
+ border-radius: var(--taskon-border-radius);
3911
+ cursor: pointer;
3912
+ flex-shrink: 0;
3913
+ color: var(--taskon-color-error);
3914
+ transition: all 0.2s ease;
3915
+ }
3916
+
3917
+ .taskon-identity-social-item__unlink-btn:hover:not(:disabled) {
3918
+ background-color: var(--taskon-color-error-bg);
3919
+ }
3920
+
3921
+ .taskon-identity-social-item__unlink-btn:disabled {
3922
+ opacity: 0.5;
3923
+ cursor: not-allowed;
3924
+ }
3925
+
3926
+ /* hover 时切换:隐藏 Linked 徽章,显示 ✕ 按钮 */
3927
+
3928
+ .taskon-identity-social-item--bound:hover .taskon-identity-social-item__linked {
3929
+ display: none;
3930
+ }
3931
+
3932
+ .taskon-identity-social-item--bound:hover
3933
+ .taskon-identity-social-item__unlink-btn {
3934
+ display: flex;
3935
+ }
3936
+
3937
+ /* 禁用解绑时(unlink-disabled),hover 不切换 */
3938
+
3939
+ .taskon-identity-social-item--unlink-disabled:hover
3940
+ .taskon-identity-social-item__linked {
3941
+ display: flex;
3942
+ }
3943
+
3944
+ .taskon-identity-social-item--unlink-disabled:hover
3945
+ .taskon-identity-social-item__unlink-btn {
3946
+ display: none;
3947
+ }
3948
+
3949
+ /* 卡片左侧内容区域 */
3950
+
3951
+ .taskon-identity-social-item__content {
3952
+ display: flex;
3953
+ align-items: center;
3954
+ gap: var(--taskon-spacing-sm);
3955
+ flex: 1;
3956
+ min-width: 0;
3957
+ }
3958
+
3959
+ /* 图标容器: 24x24 */
3960
+
3961
+ .taskon-identity-social-item__icon {
3962
+ display: flex;
3963
+ align-items: center;
3964
+ justify-content: center;
3965
+ width: 24px;
3966
+ height: 24px;
3967
+ flex-shrink: 0;
3968
+ }
3969
+
3970
+ .taskon-identity-social-item__icon svg {
3971
+ width: 24px;
3972
+ height: 24px;
3973
+ }
3974
+
3975
+ /* 文字区域 */
3976
+
3977
+ .taskon-identity-social-item__text {
3978
+ flex: 1;
3979
+ min-width: 0;
3980
+ }
3981
+
3982
+ /* 文字样式: 16px 加粗白色 */
3983
+
3984
+ .taskon-identity-social-item__name {
3985
+ font-size: var(--taskon-font-size-lg);
3986
+ font-weight: 600;
3987
+ line-height: 1.5;
3988
+ color: var(--taskon-color-text);
3989
+ white-space: nowrap;
3990
+ overflow: hidden;
3991
+ text-overflow: ellipsis;
3992
+ }
3993
+
3994
+ /* 链接样式 */
3995
+
3996
+ .taskon-identity-social-item__link {
3997
+ font-size: var(--taskon-font-size-lg);
3998
+ font-weight: 600;
3999
+ line-height: 1.5;
4000
+ color: var(--taskon-color-text);
4001
+ text-decoration: none;
4002
+ white-space: nowrap;
4003
+ overflow: hidden;
4004
+ text-overflow: ellipsis;
4005
+ display: block;
4006
+ transition: color 0.2s ease;
4007
+ }
4008
+
4009
+ .taskon-identity-social-item__link:hover {
4010
+ color: var(--taskon-color-link);
4011
+ }
4012
+
4013
+ /* 箭头按钮: 34x34 白色背景 */
4014
+
4015
+ .taskon-identity-social-btn {
4016
+ display: flex;
4017
+ align-items: center;
4018
+ justify-content: center;
4019
+ width: 34px;
4020
+ height: 34px;
4021
+ padding: var(--taskon-spacing-sm);
4022
+ background-color: var(--taskon-color-text);
4023
+ border: none;
4024
+ border-radius: var(--taskon-border-radius);
4025
+ cursor: pointer;
4026
+ flex-shrink: 0;
4027
+ color: var(--taskon-color-text-on-primary);
4028
+ transition: all 0.2s ease;
4029
+ }
4030
+
4031
+ .taskon-identity-social-btn:hover:not(:disabled) {
4032
+ background-color: var(--taskon-color-bg-floating);
4033
+ transform: translateX(2px);
4034
+ }
4035
+
4036
+ .taskon-identity-social-btn:disabled {
4037
+ opacity: 0.5;
4038
+ cursor: not-allowed;
4039
+ }
4040
+
4041
+ .taskon-identity-social-btn svg {
4042
+ width: 18px;
4043
+ height: 18px;
4044
+ }
4045
+
4046
+ /* 加载动画 */
4047
+
4048
+ .taskon-identity-social-btn__spinner {
4049
+ width: 14px;
4050
+ height: 14px;
4051
+ border: 2px solid var(--taskon-color-border);
4052
+ border-top-color: var(--taskon-color-text-on-primary);
4053
+ border-radius: 50%;
4054
+ animation: taskon-spin 1s linear infinite;
4055
+ }
4056
+
4057
+ /* ============================================================================
4058
+ Email Address - 独立模块
4059
+ https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4024-19928
4060
+ ============================================================================ */
4061
+
4062
+ /* Email Address 区域 */
4063
+
4064
+ .taskon-identity-email-section {
4065
+ display: flex;
4066
+ flex-direction: column;
4067
+ gap: var(--taskon-spacing-md);
4068
+ }
4069
+
4070
+ /* 标题: 16px 加粗白色 */
4071
+
4072
+ .taskon-identity-email-section__title {
4073
+ font-size: var(--taskon-font-size-lg);
4074
+ font-weight: 600;
4075
+ line-height: 1.5;
4076
+ color: var(--taskon-color-text);
4077
+ margin: 0;
4078
+ }
4079
+
4080
+ /* Email 卡片容器 - 单个卡片 */
4081
+
4082
+ .taskon-identity-email-card {
4083
+ display: flex;
4084
+ }
4085
+
4086
+ /* ============================================================================
4087
+ Network List - 基于 Figma 设计
4088
+ https://www.figma.com/design/T64H4qwU5lDTTpT8lSMO5n/Taskon-2.0?node-id=4024-19771
4089
+ ============================================================================ */
4090
+
4091
+ /* Network List 区域 */
4092
+
4093
+ .taskon-network-section {
4094
+ display: flex;
4095
+ flex-direction: column;
4096
+ gap: var(--taskon-spacing-md);
4097
+ }
4098
+
4099
+ /* 标题: 24px 加粗白色 */
4100
+
4101
+ .taskon-network-section__title {
4102
+ font-size: var(--taskon-font-size-xxxl);
4103
+ font-weight: 600;
4104
+ line-height: 1.33;
4105
+ color: var(--taskon-color-text);
4106
+ margin: 0;
4107
+ }
4108
+
4109
+ /* 网格布局: EVM 全宽,其他链每行 2 个 */
4110
+
4111
+ .taskon-network-grid {
4112
+ display: grid;
4113
+ grid-template-columns: repeat(2, 1fr);
4114
+ gap: var(--taskon-spacing-md);
4115
+ max-width: 630px;
4116
+ }
4117
+
4118
+ /* Network Card 基础样式 */
4119
+
4120
+ .taskon-network-card {
4121
+ position: relative;
4122
+ display: flex;
4123
+ flex-direction: column;
4124
+ gap: var(--taskon-spacing-md);
4125
+ padding: var(--taskon-spacing-md);
4126
+ background-color: var(--taskon-color-bg-surface-subtle);
4127
+ border-radius: 12px;
4128
+ box-sizing: border-box;
4129
+ }
4130
+
4131
+ /* EVM 多地址卡片: 全宽 */
4132
+
4133
+ .taskon-network-card--multi {
4134
+ grid-column: 1 / -1;
4135
+ }
4136
+
4137
+ /* 单链卡片 */
4138
+
4139
+ .taskon-network-card--single {
4140
+ min-height: 140px;
4141
+ }
4142
+
4143
+ /* 卡片头部 */
4144
+
4145
+ .taskon-network-card__header {
4146
+ display: flex;
4147
+ align-items: center;
4148
+ }
4149
+
4150
+ /* 链标签: 14px medium 白色 */
4151
+
4152
+ .taskon-network-card__label {
4153
+ font-size: var(--taskon-font-size);
4154
+ font-weight: 500;
4155
+ line-height: 1.43;
4156
+ color: var(--taskon-color-text);
4157
+ }
4158
+
4159
+ /* 链图标容器 */
4160
+
4161
+ .taskon-network-card__chain-icon {
4162
+ display: flex;
4163
+ gap: var(--taskon-spacing-sm);
4164
+ }
4165
+
4166
+ .taskon-network-card__chain-icon svg,
4167
+ .taskon-network-card__chain-icon img {
4168
+ width: 24px;
4169
+ height: 24px;
4170
+ border-radius: 8px;
4171
+ object-fit: contain;
4172
+ flex-shrink: 0;
4173
+ }
4174
+
4175
+ /* EVM 多链图标行 */
4176
+
4177
+ .taskon-network-chain-icons {
4178
+ display: flex;
4179
+ flex-wrap: wrap;
4180
+ gap: var(--taskon-spacing-sm);
4181
+ align-items: center;
4182
+ }
4183
+
4184
+ .taskon-network-chain-icons svg {
4185
+ width: 24px;
4186
+ height: 24px;
4187
+ border-radius: 8px;
4188
+ flex-shrink: 0;
4189
+ }
4190
+
4191
+ .taskon-network-chain-icons img {
4192
+ display: block;
4193
+ flex-shrink: 0;
4194
+ max-width: 100%;
4195
+ height: auto;
4196
+ }
4197
+
4198
+ .taskon-network-chain-icons__more {
4199
+ display: flex;
4200
+ align-items: center;
4201
+ justify-content: center;
4202
+ width: 24px;
4203
+ height: 24px;
4204
+ background-color: var(--taskon-color-bg-floating);
4205
+ border-radius: 8px;
4206
+ }
4207
+
4208
+ /* 地址列表容器 */
4209
+
4210
+ .taskon-network-card__addresses {
4211
+ display: flex;
4212
+ flex-direction: column;
4213
+ gap: var(--taskon-spacing-sm);
4214
+ }
4215
+
4216
+ /* 地址行 */
4217
+
4218
+ .taskon-network-address-row {
4219
+ display: flex;
4220
+ align-items: center;
4221
+ gap: var(--taskon-spacing-md);
4222
+ height: 40px;
4223
+ padding: 0 var(--taskon-spacing-md);
4224
+ background-color: var(--taskon-color-bg-surface-subtle);
4225
+ border-radius: var(--taskon-border-radius);
4226
+ backdrop-filter: blur(10px);
4227
+ }
4228
+
4229
+ .taskon-network-address-row__left {
4230
+ display: flex;
4231
+ align-items: center;
4232
+ gap: var(--taskon-spacing-sm);
4233
+ flex: 1;
4234
+ }
4235
+
4236
+ .taskon-network-address-row__addr {
4237
+ font-size: var(--taskon-font-size);
4238
+ font-weight: 500;
4239
+ line-height: 1.43;
4240
+ color: var(--taskon-color-text);
4241
+ }
4242
+
4243
+ .taskon-network-address-row__addr--secondary {
4244
+ color: var(--taskon-color-text-tertiary);
4245
+ }
4246
+
4247
+ .taskon-network-address-row__divider {
4248
+ width: 1px;
4249
+ height: 15px;
4250
+ background-color: var(--taskon-color-text-tertiary);
4251
+ opacity: 0.1;
4252
+ }
4253
+
4254
+ .taskon-network-address-row__right {
4255
+ display: flex;
4256
+ align-items: center;
4257
+ gap: var(--taskon-spacing-sm);
4258
+ min-width: 142px;
4259
+ justify-content: flex-end;
4260
+ }
4261
+
4262
+ .taskon-network-address-row__type {
4263
+ font-size: var(--taskon-font-size);
4264
+ font-weight: 400;
4265
+ line-height: normal;
4266
+ text-transform: capitalize;
4267
+ }
4268
+
4269
+ .taskon-network-address-row__type--primary {
4270
+ color: var(--taskon-color-secondary);
4271
+ }
4272
+
4273
+ .taskon-network-address-row__type--secondary {
4274
+ color: var(--taskon-color-primary);
4275
+ }
4276
+
4277
+ .taskon-network-address-row__edit {
4278
+ width: 14px;
4279
+ height: 14px;
4280
+ color: var(--taskon-color-text-tertiary);
4281
+ cursor: pointer;
4282
+ }
4283
+
4284
+ /* 复制按钮 */
4285
+
4286
+ .taskon-network-copy-btn {
4287
+ display: flex;
4288
+ align-items: center;
4289
+ justify-content: center;
4290
+ padding: 0;
4291
+ background: none;
4292
+ border: none;
4293
+ cursor: pointer;
4294
+ color: var(--taskon-color-text);
4295
+ transition: color 0.2s ease;
4296
+ }
4297
+
4298
+ .taskon-network-copy-btn:hover {
4299
+ color: var(--taskon-color-link);
4300
+ }
4301
+
4302
+ /* Unbind 徽章按钮 */
4303
+
4304
+ .taskon-network-unbind-badge {
4305
+ display: flex;
4306
+ align-items: center;
4307
+ justify-content: center;
4308
+ height: 20px;
4309
+ padding: 0 var(--taskon-spacing-sm);
4310
+ font-size: var(--taskon-font-size-sm);
4311
+ font-weight: 600;
4312
+ line-height: 1;
4313
+ color: var(--taskon-color-text);
4314
+ background-color: var(--taskon-color-border);
4315
+ border: none;
4316
+ border-radius: 4px;
4317
+ cursor: pointer;
4318
+ transition: all 0.2s ease;
4319
+ flex-shrink: 0;
4320
+ }
4321
+
4322
+ .taskon-network-unbind-badge:hover:not(:disabled) {
4323
+ background-color: var(--taskon-color-bg-surface-strong);
4324
+ }
4325
+
4326
+ .taskon-network-unbind-badge:disabled {
4327
+ opacity: 0.5;
4328
+ cursor: not-allowed;
4329
+ }
4330
+
4331
+ /* 右上角的 Unbind 按钮(单链卡片) */
4332
+
4333
+ .taskon-network-unbind-badge--corner {
4334
+ position: absolute;
4335
+ top: 8px;
4336
+ right: 9px;
4337
+ }
4338
+
4339
+ /* 地址输入框样式(单链卡片) */
4340
+
4341
+ .taskon-network-address-input {
4342
+ display: flex;
4343
+ align-items: center;
4344
+ justify-content: space-between;
4345
+ height: 34px;
4346
+ padding: 0 var(--taskon-spacing-md);
4347
+ background-color: var(--taskon-color-bg-surface-subtle);
4348
+ border-radius: var(--taskon-border-radius);
4349
+ backdrop-filter: blur(10px);
4350
+ }
4351
+
4352
+ .taskon-network-address-input__text {
4353
+ font-size: var(--taskon-font-size);
4354
+ font-weight: 500;
4355
+ line-height: 1.43;
4356
+ color: var(--taskon-color-text);
4357
+ }
4358
+
4359
+ /* Connect Wallet 按钮 */
4360
+
4361
+ .taskon-network-connect-btn {
4362
+ display: flex;
4363
+ align-items: center;
4364
+ justify-content: center;
4365
+ height: 34px;
4366
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-sm);
4367
+ font-size: var(--taskon-font-size);
4368
+ font-weight: 500;
4369
+ line-height: 1.43;
4370
+ color: var(--taskon-color-text-on-primary);
4371
+ background-color: var(--taskon-color-text);
4372
+ border: none;
4373
+ border-radius: var(--taskon-border-radius);
4374
+ cursor: pointer;
4375
+ transition: all 0.2s ease;
4376
+ }
4377
+
4378
+ .taskon-network-connect-btn:hover:not(:disabled) {
4379
+ background-color: var(--taskon-color-bg-floating);
4380
+ }
4381
+
4382
+ .taskon-network-connect-btn:disabled {
4383
+ opacity: 0.5;
4384
+ cursor: not-allowed;
4385
+ }
4386
+
4387
+ /* ============================================================================
4388
+ Network List 响应式适配
4389
+ ============================================================================ */
4390
+
4391
+ @media (max-width: 750px) {
4392
+ .taskon-network-section__title {
4393
+ font-size: 20px;
4394
+ line-height: 1.4;
4395
+ }
4396
+
4397
+ .taskon-network-grid {
4398
+ grid-template-columns: 1fr;
4399
+ max-width: 100%;
4400
+ }
4401
+
4402
+ .taskon-network-card {
4403
+ padding: var(--taskon-spacing-md);
4404
+ }
4405
+
4406
+ .taskon-network-address-row {
4407
+ flex-wrap: wrap;
4408
+ height: auto;
4409
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-sm);
4410
+ gap: var(--taskon-spacing-sm);
4411
+ }
4412
+
4413
+ .taskon-network-address-row__left {
4414
+ width: 100%;
4415
+ }
4416
+
4417
+ .taskon-network-address-row__divider {
4418
+ display: none;
4419
+ }
4420
+
4421
+ .taskon-network-address-row__right {
4422
+ min-width: auto;
4423
+ justify-content: flex-start;
4424
+ }
4425
+
4426
+ .taskon-network-address-row__type {
4427
+ font-size: var(--taskon-font-size-sm);
4428
+ }
4429
+ }
4430
+
4431
+ /* ============================================================================
4432
+ Wallet Addresses Section (保留原有样式)
4433
+ ============================================================================ */
4434
+
4435
+ /* Identity Section */
4436
+
4437
+ .taskon-identity-section {
4438
+ display: flex;
4439
+ flex-direction: column;
4440
+ gap: var(--taskon-spacing-md);
4441
+ }
4442
+
4443
+ .taskon-identity-section__title {
4444
+ font-size: var(--taskon-font-size-lg);
4445
+ font-weight: 600;
4446
+ color: var(--taskon-color-text);
4447
+ margin: 0;
4448
+ }
4449
+
4450
+ /* Identity List */
4451
+
4452
+ .taskon-identity-list {
4453
+ display: flex;
4454
+ flex-direction: column;
4455
+ gap: var(--taskon-spacing-sm);
4456
+ }
4457
+
4458
+ /* Identity Item (用于钱包) */
4459
+
4460
+ .taskon-identity-item {
4461
+ display: flex;
4462
+ align-items: center;
4463
+ gap: var(--taskon-spacing-md);
4464
+ padding: var(--taskon-spacing-md);
4465
+ background-color: var(--taskon-color-bg-surface-subtle);
4466
+ border-radius: var(--taskon-border-radius);
4467
+ transition: all 0.2s ease;
4468
+ }
4469
+
4470
+ .taskon-identity-item:hover {
4471
+ background-color: var(--taskon-color-bg-surface-strong);
4472
+ }
4473
+
4474
+ .taskon-identity-item--bound {
4475
+ background-color: var(--taskon-color-bg-surface-subtle);
4476
+ }
4477
+
4478
+ .taskon-identity-item__icon {
4479
+ display: flex;
4480
+ align-items: center;
4481
+ justify-content: center;
4482
+ width: 40px;
4483
+ height: 40px;
4484
+ font-size: 20px;
4485
+ background-color: var(--taskon-color-bg-surface-strong);
4486
+ border-radius: var(--taskon-border-radius);
4487
+ flex-shrink: 0;
4488
+ }
4489
+
4490
+ .taskon-identity-item--bound .taskon-identity-item__icon {
4491
+ background-color: var(--taskon-color-bg-surface-strong);
4492
+ }
4493
+
4494
+ .taskon-identity-item__info {
4495
+ flex: 1;
4496
+ display: flex;
4497
+ flex-direction: column;
4498
+ gap: 2px;
4499
+ min-width: 0;
4500
+ }
4501
+
4502
+ .taskon-identity-item__name {
4503
+ font-size: var(--taskon-font-size);
4504
+ font-weight: 500;
4505
+ color: var(--taskon-color-text);
4506
+ }
4507
+
4508
+ .taskon-identity-item__value {
4509
+ display: flex;
4510
+ align-items: center;
4511
+ gap: var(--taskon-spacing-xs);
4512
+ font-size: var(--taskon-font-size-sm);
4513
+ color: var(--taskon-color-text-tertiary);
4514
+ }
4515
+
4516
+ .taskon-identity-item__link {
4517
+ color: var(--taskon-color-link);
4518
+ text-decoration: none;
4519
+ transition: color 0.2s ease;
4520
+ }
4521
+
4522
+ .taskon-identity-item__link:hover {
4523
+ text-decoration: underline;
4524
+ }
4525
+
4526
+ .taskon-identity-item__address {
4527
+ font-size: var(--taskon-font-size-sm);
4528
+ }
4529
+
4530
+ .taskon-identity-item__badge {
4531
+ display: inline-flex;
4532
+ align-items: center;
4533
+ padding: 2px 6px;
4534
+ font-size: var(--taskon-font-size-sm);
4535
+ font-weight: 500;
4536
+ color: var(--taskon-color-link);
4537
+ background-color: var(--taskon-color-secondary-bg);
4538
+ border-radius: var(--taskon-border-radius-sm);
4539
+ }
4540
+
4541
+ .taskon-identity-item__action {
4542
+ flex-shrink: 0;
4543
+ }
4544
+
4545
+ /* Identity Button */
4546
+
4547
+ .taskon-identity-btn {
4548
+ display: inline-flex;
4549
+ align-items: center;
4550
+ justify-content: center;
4551
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
4552
+ font-size: var(--taskon-font-size-sm);
4553
+ font-weight: 500;
4554
+ border-radius: var(--taskon-border-radius);
4555
+ border: none;
4556
+ cursor: pointer;
4557
+ transition: all 0.2s ease;
4558
+ min-width: 72px;
4559
+ height: 32px;
4560
+ }
4561
+
4562
+ .taskon-identity-btn:disabled {
4563
+ opacity: 0.5;
4564
+ cursor: not-allowed;
4565
+ }
4566
+
4567
+ .taskon-identity-btn--bind {
4568
+ background-color: var(--taskon-color-text);
4569
+ color: var(--taskon-color-text-on-primary);
4570
+ }
4571
+
4572
+ .taskon-identity-btn--bind:hover:not(:disabled) {
4573
+ background-color: var(--taskon-color-bg-floating);
4574
+ }
4575
+
4576
+ .taskon-identity-btn--unbind {
4577
+ background: transparent;
4578
+ color: var(--taskon-color-text-tertiary);
4579
+ border: 1px solid var(--taskon-color-border);
4580
+ }
4581
+
4582
+ .taskon-identity-btn--unbind:hover:not(:disabled) {
4583
+ color: var(--taskon-color-error);
4584
+ border-color: var(--taskon-color-error);
4585
+ background-color: var(--taskon-color-error-bg);
4586
+ }
4587
+
4588
+ /* ============================================================================
4589
+ Confirm Unlink Dialog 样式
4590
+ ============================================================================ */
4591
+
4592
+ .taskon-confirm-unlink {
4593
+ display: flex;
4594
+ flex-direction: column;
4595
+ align-items: center;
4596
+ gap: var(--taskon-spacing-lg);
4597
+ padding: var(--taskon-spacing-lg) var(--taskon-spacing-md);
4598
+ }
4599
+
4600
+ .taskon-confirm-unlink__icon {
4601
+ display: flex;
4602
+ align-items: center;
4603
+ justify-content: center;
4604
+ width: 48px;
4605
+ height: 48px;
4606
+ border-radius: 50%;
4607
+ background-color: var(--taskon-color-error-bg);
4608
+ color: var(--taskon-color-error);
4609
+ flex-shrink: 0;
4610
+ }
4611
+
4612
+ .taskon-confirm-unlink__text {
4613
+ display: flex;
4614
+ flex-direction: column;
4615
+ align-items: center;
4616
+ gap: var(--taskon-spacing-sm);
4617
+ text-align: center;
4618
+ }
4619
+
4620
+ .taskon-confirm-unlink__title {
4621
+ font-size: var(--taskon-font-size-xl);
4622
+ font-weight: 600;
4623
+ line-height: 1.33;
4624
+ color: var(--taskon-color-text);
4625
+ margin: 0;
4626
+ }
4627
+
4628
+ .taskon-confirm-unlink__description {
4629
+ font-size: var(--taskon-font-size);
4630
+ font-weight: 400;
4631
+ line-height: 1.43;
4632
+ color: var(--taskon-color-text-tertiary);
4633
+ margin: 0;
4634
+ }
4635
+
4636
+ .taskon-confirm-unlink__actions {
4637
+ display: flex;
4638
+ gap: var(--taskon-spacing-sm);
4639
+ width: 100%;
4640
+ }
4641
+
4642
+ .taskon-confirm-unlink__btn {
4643
+ flex: 1;
4644
+ display: flex;
4645
+ align-items: center;
4646
+ justify-content: center;
4647
+ height: 40px;
4648
+ padding: 0 var(--taskon-spacing-md);
4649
+ font-size: var(--taskon-font-size);
4650
+ font-weight: 500;
4651
+ border-radius: var(--taskon-border-radius);
4652
+ border: none;
4653
+ cursor: pointer;
4654
+ transition: all 0.2s ease;
4655
+ }
4656
+
4657
+ .taskon-confirm-unlink__btn:disabled {
4658
+ opacity: 0.5;
4659
+ cursor: not-allowed;
4660
+ }
4661
+
4662
+ .taskon-confirm-unlink__btn--cancel {
4663
+ color: var(--taskon-color-text);
4664
+ background-color: var(--taskon-color-border);
4665
+ border: 1px solid var(--taskon-color-border);
4666
+ }
4667
+
4668
+ .taskon-confirm-unlink__btn--cancel:hover:not(:disabled) {
4669
+ background-color: var(--taskon-color-bg-surface-strong);
4670
+ }
4671
+
4672
+ .taskon-confirm-unlink__btn--confirm {
4673
+ color: var(--taskon-color-text-on-primary);
4674
+ background-color: var(--taskon-color-error);
4675
+ }
4676
+
4677
+ .taskon-confirm-unlink__btn--confirm:hover:not(:disabled) {
4678
+ background-color: var(--taskon-color-error);
4679
+ }
4680
+
4681
+ /* ============================================================================
4682
+ 响应式适配 - Identity
4683
+ ============================================================================ */
4684
+
4685
+ @media (max-width: 1000px) {
4686
+ /* 中等屏幕:每行 2 个 */
4687
+ .taskon-identity-social-item {
4688
+ width: 48%;
4689
+ min-width: 280px;
4690
+ }
4691
+ }
4692
+
4693
+ @media (max-width: 750px) {
4694
+ /* 小屏幕:每行 1 个,全宽 */
4695
+ .taskon-identity-social-section__title {
4696
+ font-size: 20px;
4697
+ line-height: 1.4;
4698
+ }
4699
+
4700
+ .taskon-identity-social-item {
4701
+ width: 100%;
4702
+ min-width: auto;
4703
+ }
4704
+
4705
+ .taskon-identity-section__title {
4706
+ font-size: var(--taskon-font-size);
4707
+ }
4708
+
4709
+ .taskon-identity-item {
4710
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
4711
+ gap: var(--taskon-spacing-sm);
4712
+ }
4713
+
4714
+ .taskon-identity-item__icon {
4715
+ width: 32px;
4716
+ height: 32px;
4717
+ font-size: var(--taskon-font-size-lg);
4718
+ }
4719
+
4720
+ .taskon-identity-item__name {
4721
+ font-size: var(--taskon-font-size-sm);
4722
+ }
4723
+
4724
+ .taskon-identity-item__value {
4725
+ font-size: var(--taskon-font-size-sm);
4726
+ }
4727
+
4728
+ .taskon-identity-btn {
4729
+ padding: var(--taskon-spacing-xs) var(--taskon-spacing-sm);
4730
+ font-size: var(--taskon-font-size-sm);
4731
+ min-width: 60px;
4732
+ height: 28px;
4733
+ }
4734
+ }
4735
+
4736
+ @media (max-width: 750px) {
4737
+ .taskon-user-center {
4738
+ gap: var(--taskon-spacing-md);
4739
+ padding: var(--taskon-spacing-md);
4740
+ border-radius: var(--taskon-border-radius-sm);
4741
+ }
4742
+
4743
+ .taskon-user-center-content {
4744
+ min-height: 0;
4745
+ }
4746
+
4747
+ .taskon-user-center .taskon-table__header,
4748
+ .taskon-user-center .taskon-table__cell {
4749
+ padding: var(--taskon-spacing-xs) var(--taskon-spacing-sm);
4750
+ font-size: var(--taskon-font-size-sm);
4751
+ line-height: 1.5;
4752
+ }
4753
+
4754
+ .taskon-user-center .taskon-table__row {
4755
+ height: 60px;
4756
+ }
4757
+
4758
+ .taskon-user-center-pagination {
4759
+ margin-top: var(--taskon-spacing-lg);
4760
+ }
4761
+
4762
+ .taskon-my-rewards {
4763
+ gap: var(--taskon-spacing-lg);
4764
+ }
4765
+
4766
+ .taskon-my-rewards__section {
4767
+ gap: var(--taskon-spacing-sm);
4768
+ }
4769
+
4770
+ .taskon-my-rewards__section-title,
4771
+ .taskon-asset-carousel__title,
4772
+ .taskon-frozen-assets__title,
4773
+ .taskon-xp-level-card__history-title {
4774
+ font-size: var(--taskon-font-size);
4775
+ line-height: 1.43;
4776
+ }
4777
+
4778
+ .taskon-asset-carousel {
4779
+ gap: var(--taskon-spacing-sm);
4780
+ margin-bottom: var(--taskon-spacing-lg);
4781
+ }
4782
+
4783
+ .taskon-asset-carousel__container {
4784
+ gap: var(--taskon-spacing-xs);
4785
+ }
4786
+
4787
+ .taskon-asset-card {
4788
+ min-width: calc(50% - 4px);
4789
+ gap: var(--taskon-spacing-sm);
4790
+ padding: var(--taskon-spacing-sm);
4791
+ }
4792
+
4793
+ .taskon-asset-card__icon,
4794
+ .taskon-asset-card__icon-img {
4795
+ width: 40px;
4796
+ height: 40px;
4797
+ }
4798
+
4799
+ .taskon-asset-card__value {
4800
+ font-size: var(--taskon-font-size-lg);
4801
+ line-height: 1.38;
4802
+ }
4803
+
4804
+ .taskon-withdraw-pending {
4805
+ align-items: flex-start;
4806
+ gap: var(--taskon-spacing-sm);
4807
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
4808
+ }
4809
+
4810
+ .taskon-withdraw-pending__text {
4811
+ font-size: var(--taskon-font-size);
4812
+ white-space: normal;
4813
+ }
4814
+
4815
+ .taskon-withdraw-pending__count {
4816
+ font-size: var(--taskon-font-size-sm);
4817
+ }
4818
+
4819
+ .taskon-token-assets__symbol-cell,
4820
+ .taskon-token-assets__network-cell {
4821
+ gap: var(--taskon-spacing-xs);
4822
+ }
4823
+
4824
+ .taskon-token-assets__symbol,
4825
+ .taskon-token-assets__chain,
4826
+ .taskon-token-assets__balance,
4827
+ .taskon-token-assets__frozen-btn {
4828
+ font-size: var(--taskon-font-size-sm);
4829
+ }
4830
+
4831
+ .taskon-token-assets__withdraw-btn {
4832
+ height: 30px !important;
4833
+ padding: var(--taskon-spacing-xs) var(--taskon-spacing-sm) !important;
4834
+ font-size: var(--taskon-font-size-sm) !important;
4835
+ }
4836
+
4837
+ .taskon-activity-history__campaign-name {
4838
+ font-size: var(--taskon-font-size-sm);
4839
+ line-height: 1.5;
4840
+ }
4841
+
4842
+ .taskon-activity-history__campaign-type {
4843
+ font-size: var(--taskon-font-size-sm);
4844
+ line-height: 1.17;
4845
+ }
4846
+
4847
+ .taskon-activity-history__cell--time {
4848
+ font-size: var(--taskon-font-size-sm);
4849
+ line-height: 1.33;
4850
+ }
4851
+
4852
+ .taskon-reward-detail__row {
4853
+ align-items: flex-start;
4854
+ flex-wrap: wrap;
4855
+ gap: var(--taskon-spacing-sm);
4856
+ padding: var(--taskon-spacing-sm);
4857
+ }
4858
+
4859
+ .taskon-reward-detail__row--nft {
4860
+ padding: var(--taskon-spacing-sm);
4861
+ }
4862
+
4863
+ .taskon-reward-detail__cell--time {
4864
+ width: 100%;
4865
+ font-size: var(--taskon-font-size-sm);
4866
+ line-height: 1.33;
4867
+ white-space: normal;
4868
+ }
4869
+
4870
+ .taskon-reward-detail__cell--action {
4871
+ width: 100%;
4872
+ margin-left: 0;
4873
+ }
4874
+
4875
+ .taskon-reward-detail__claim-btn {
4876
+ width: 100%;
4877
+ }
4878
+
4879
+ .taskon-reward-detail__primary {
4880
+ font-size: var(--taskon-font-size-sm);
4881
+ line-height: 1.5;
4882
+ }
4883
+
4884
+ .taskon-frozen-assets__item {
4885
+ align-items: flex-start;
4886
+ flex-direction: column;
4887
+ gap: var(--taskon-spacing-sm);
4888
+ }
4889
+
4890
+ .taskon-frozen-assets__resend-btn {
4891
+ width: 100%;
4892
+ }
4893
+
4894
+ .taskon-xp-level-card__header {
4895
+ align-items: flex-start;
4896
+ flex-direction: column;
4897
+ gap: var(--taskon-spacing-sm);
4898
+ }
4899
+
4900
+ .taskon-xp-level-card__xp {
4901
+ align-items: flex-start;
4902
+ }
4903
+
4904
+ .taskon-xp-level-card__level-badge {
4905
+ width: 40px;
4906
+ height: 40px;
4907
+ font-size: var(--taskon-font-size-lg);
4908
+ }
4909
+
4910
+ .taskon-xp-level-card__level-value {
4911
+ font-size: var(--taskon-font-size-xl);
4912
+ }
4913
+
4914
+ .taskon-confirm-unlink__actions {
4915
+ flex-direction: column;
4916
+ }
4917
+ }