@taskon/widget-react 0.0.1-beta.1 → 0.0.1-beta.3

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 (43) hide show
  1. package/README.md +55 -16
  2. package/dist/CommunityTaskList.css +432 -628
  3. package/dist/EligibilityInfo.css +944 -431
  4. package/dist/PageBuilder.css +0 -2
  5. package/dist/Quest.css +460 -506
  6. package/dist/TaskOnProvider.css +15 -15
  7. package/dist/UserCenterWidget.css +0 -174
  8. package/dist/UserCenterWidget2.css +1119 -341
  9. package/dist/chunks/{CommunityTaskList-DoPGZsw1.js → CommunityTaskList-C9mPl_31.js} +923 -829
  10. package/dist/chunks/{EligibilityInfo-C7GZ2G5u.js → EligibilityInfo-DGBffKN8.js} +1137 -449
  11. package/dist/chunks/{LeaderboardWidget-CmYfDeHV.js → LeaderboardWidget-DPOQVXkT.js} +15 -10
  12. package/dist/chunks/{PageBuilder-Tmhf2GTS.js → PageBuilder-WCZvxL2j.js} +5 -5
  13. package/dist/chunks/{Quest-DKFZ-pPU.js → Quest-DjGH_8bx.js} +464 -314
  14. package/dist/chunks/{TaskOnProvider-BD6Vp2x8.js → TaskOnProvider-iannERG1.js} +2 -207
  15. package/dist/chunks/{ThemeProvider-wnSXrNQb.js → ThemeProvider-DNJqI2lD.js} +246 -54
  16. package/dist/chunks/UserCenterWidget-B0O-f_xl.js +8344 -0
  17. package/dist/chunks/{UserCenterWidget-BVw_IEEd.js → UserCenterWidget-CAhgp46j.js} +214 -1011
  18. package/dist/chunks/{WidgetShell-D_5OjvNZ.js → dynamic-import-helper-B2j_dZ4V.js} +607 -40
  19. package/dist/chunks/useToast-CaRkylKe.js +304 -0
  20. package/dist/chunks/{usercenter-ja-uu-XfVF9.js → usercenter-ja-B2465c1O.js} +4 -10
  21. package/dist/chunks/{usercenter-ko-DYgUOVzd.js → usercenter-ko-xAEYxqLg.js} +4 -10
  22. package/dist/community-task.d.ts +34 -3
  23. package/dist/community-task.js +1 -1
  24. package/dist/core.d.ts +40 -3
  25. package/dist/core.js +9 -10
  26. package/dist/dynamic-import-helper.css +186 -0
  27. package/dist/index.d.ts +207 -10
  28. package/dist/index.js +21 -19
  29. package/dist/leaderboard.d.ts +8 -1
  30. package/dist/leaderboard.js +2 -2
  31. package/dist/page-builder.js +1 -1
  32. package/dist/quest.d.ts +8 -2
  33. package/dist/quest.js +1 -1
  34. package/dist/user-center.d.ts +20 -136
  35. package/dist/user-center.js +19 -236
  36. package/package.json +7 -2
  37. package/dist/TipPopover.css +0 -210
  38. package/dist/WidgetShell.css +0 -182
  39. package/dist/chunks/TipPopover-BrW8jo71.js +0 -2926
  40. package/dist/chunks/UserCenterWidget-BE329iS7.js +0 -3546
  41. package/dist/chunks/dynamic-import-helper-DxEFwm31.js +0 -537
  42. package/dist/chunks/useToast-B-wyO5zL.js +0 -93
  43. package/dist/chunks/useWidgetLocale-JDelxtt8.js +0 -74
@@ -1,35 +1,742 @@
1
+ /**
2
+ * Input 通用组件样式
3
+ * @description 复刻 Vue 版本 BaseInputPro.vue 样式
4
+ * 使用 taskon-input 命名空间
5
+ */
6
+
7
+ /* ==================== 输入框 ==================== */
8
+ .taskon-input {
9
+ width: 100%;
10
+ height: 40px;
11
+ padding: 0 12px;
12
+ border-radius: 6px;
13
+ border: 1px solid var(--taskon-color-border);
14
+ background: var(--taskon-color-bg-surface-subtle);
15
+ color: var(--taskon-color-text);
16
+ font-size: 14px;
17
+ line-height: 40px;
18
+ letter-spacing: 0.04em;
19
+ outline: none;
20
+ transition: border-color 0.2s;
21
+ }
22
+
23
+ .taskon-input:focus {
24
+ border-color: var(--taskon-color-primary);
25
+ }
26
+
27
+ .taskon-input:disabled {
28
+ opacity: 0.6;
29
+ cursor: not-allowed;
30
+ }
31
+
32
+ .taskon-input--error {
33
+ border-color: var(--taskon-color-error);
34
+ }
35
+
36
+ .taskon-input::placeholder {
37
+ color: var(--taskon-color-text-tertiary);
38
+ font-weight: 400;
39
+ }
40
+
41
+ /* ==================== 包装器(用于 rightSlot 和 error) ==================== */
42
+ .taskon-input-wrapper {
43
+ width: 100%;
44
+ }
45
+
46
+ /* ==================== 容器(包含输入框和右侧插槽) ==================== */
47
+ .taskon-input-container {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 8px;
51
+ padding-right: 12px;
52
+ border-radius: 6px;
53
+ border: 1px solid var(--taskon-color-border);
54
+ background: var(--taskon-color-bg-surface-subtle);
55
+ transition: border-color 0.2s;
56
+ }
57
+
58
+ .taskon-input-container:focus-within {
59
+ border-color: var(--taskon-color-primary);
60
+ }
61
+
62
+ .taskon-input-container--error {
63
+ border-color: var(--taskon-color-error);
64
+ }
65
+
66
+ /* 容器内的输入框样式重置 */
67
+ .taskon-input--in-container {
68
+ flex: 1;
69
+ border: none;
70
+ background: transparent;
71
+ border-radius: 0;
72
+ }
73
+
74
+ .taskon-input--in-container:focus {
75
+ border-color: transparent;
76
+ }
77
+
78
+ /* ==================== 右侧插槽 ==================== */
79
+ .taskon-input-slot {
80
+ flex-shrink: 0;
81
+ display: flex;
82
+ align-items: center;
83
+ }
84
+
85
+ /* MAX 按钮样式(通用样式) */
86
+ .taskon-input-slot button {
87
+ padding: 4px 8px;
88
+ font-size: 12px;
89
+ font-weight: 600;
90
+ color: var(--taskon-color-primary);
91
+ background: transparent;
92
+ border: 1px solid var(--taskon-color-primary);
93
+ border-radius: 4px;
94
+ cursor: pointer;
95
+ transition: all 0.2s;
96
+ }
97
+
98
+ .taskon-input-slot button:hover:not(:disabled) {
99
+ background: var(--taskon-color-primary-bg);
100
+ }
101
+
102
+ .taskon-input-slot button:disabled {
103
+ opacity: 0.5;
104
+ cursor: not-allowed;
105
+ }
106
+
107
+ /* ==================== 错误信息 ==================== */
108
+ .taskon-input-error {
109
+ margin: 4px 0 0 0;
110
+ font-size: 12px;
111
+ color: var(--taskon-color-error);
112
+ line-height: 1.4;
113
+ }
114
+
115
+ /* ==================== 响应式 ==================== */
116
+ @media (max-width: 750px) {
117
+ .taskon-input {
118
+ height: 10.667vw;
119
+ padding: 0 3.2vw;
120
+ font-size: 3.733vw;
121
+ line-height: 10.667vw;
122
+ }
123
+
124
+ .taskon-input-container {
125
+ padding-right: 3.2vw;
126
+ gap: 2.133vw;
127
+ }
128
+
129
+ .taskon-input-slot button {
130
+ padding: 1.067vw 2.133vw;
131
+ font-size: 3.2vw;
132
+ }
133
+
134
+ .taskon-input-error {
135
+ margin-top: 1.067vw;
136
+ font-size: 3.2vw;
137
+ }
138
+ }
139
+ /**
140
+ * ClaimNftDialog 样式
141
+ */
142
+
143
+ .taskon-claim-dialog {
144
+ max-width: 400px;
145
+ }
146
+
147
+ .taskon-claim-dialog-content {
148
+ display: flex;
149
+ flex-direction: column;
150
+ align-items: center;
151
+ padding: 24px;
152
+ text-align: center;
153
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
154
+ }
155
+
156
+ /* NFT 图片 */
157
+ .taskon-claim-dialog-nft {
158
+ margin-bottom: 20px;
159
+ }
160
+
161
+ .taskon-claim-dialog-nft__image {
162
+ width: 120px;
163
+ height: 120px;
164
+ border-radius: 12px;
165
+ object-fit: cover;
166
+ }
167
+
168
+ /* 状态图标区域 */
169
+ .taskon-claim-dialog-status {
170
+ margin-bottom: 16px;
171
+ min-height: 48px;
172
+ display: flex;
173
+ align-items: center;
174
+ justify-content: center;
175
+ }
176
+
177
+ /* 加载动画 */
178
+ .taskon-claim-dialog-spinner {
179
+ width: 48px;
180
+ height: 48px;
181
+ position: relative;
182
+ }
183
+
184
+ .taskon-claim-dialog-spinner__circle {
185
+ width: 100%;
186
+ height: 100%;
187
+ border: 3px solid var(--taskon-color-border-secondary, rgba(255, 255, 255, 0.16));
188
+ border-top-color: var(--taskon-uc-color-link, var(--taskon-color-primary, #ffd465));
189
+ border-radius: 50%;
190
+ animation: taskon-claim-spin 0.8s linear infinite;
191
+ }
192
+
193
+ @keyframes taskon-claim-spin {
194
+ to {
195
+ transform: rotate(360deg);
196
+ }
197
+ }
198
+
199
+ /* 状态图标 */
200
+ .taskon-claim-dialog-icon {
201
+ width: 48px;
202
+ height: 48px;
203
+ }
204
+
205
+ .taskon-claim-dialog-icon--success {
206
+ color: var(--taskon-color-success, #22c55e);
207
+ }
208
+
209
+ .taskon-claim-dialog-icon--error {
210
+ color: var(--taskon-color-error, #ef4444);
211
+ }
212
+
213
+ /* 状态消息 */
214
+ .taskon-claim-dialog-message {
215
+ font-size: 16px;
216
+ font-weight: 500;
217
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
218
+ margin: 0 0 16px;
219
+ line-height: 1.5;
220
+ }
221
+
222
+ /* 交易 Hash */
223
+ .taskon-claim-dialog-tx {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 8px;
227
+ padding: 8px 16px;
228
+ background: var(--taskon-uc-color-text-invisible, rgba(255, 255, 255, 0.04));
229
+ border-radius: 8px;
230
+ margin-bottom: 20px;
231
+ font-size: 14px;
232
+ }
233
+
234
+ .taskon-claim-dialog-tx__label {
235
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.6));
236
+ }
237
+
238
+ .taskon-claim-dialog-tx__hash {
239
+ color: var(--taskon-uc-color-link, var(--taskon-color-primary, #ffd465));
240
+ font-family: monospace;
241
+ }
242
+
243
+ /* 操作按钮 */
244
+ .taskon-claim-dialog-actions {
245
+ display: flex;
246
+ gap: 12px;
247
+ width: 100%;
248
+ justify-content: center;
249
+ }
250
+
251
+ .taskon-claim-dialog-btn {
252
+ padding: 10px 24px;
253
+ border-radius: 8px;
254
+ font-size: 14px;
255
+ font-weight: 500;
256
+ cursor: pointer;
257
+ transition: all 0.2s ease;
258
+ border: none;
259
+ }
260
+
261
+ .taskon-claim-dialog-btn--primary {
262
+ background: var(--taskon-uc-color-link, var(--taskon-color-primary, #ffd465));
263
+ color: #18181b;
264
+ }
265
+
266
+ .taskon-claim-dialog-btn--primary:hover {
267
+ filter: brightness(0.95);
268
+ }
269
+
270
+ .taskon-claim-dialog-btn--secondary {
271
+ background: transparent;
272
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
273
+ border: 1px solid var(--taskon-uc-color-border-btn, rgba(255, 255, 255, 0.1));
274
+ }
275
+
276
+ .taskon-claim-dialog-btn--secondary:hover {
277
+ background: rgba(255, 255, 255, 0.06);
278
+ }
279
+ /**
280
+ * PendingTxDialog 样式
281
+ */
282
+
283
+ .taskon-pending-dialog {
284
+ max-width: 460px;
285
+ }
286
+
287
+ .taskon-pending-dialog-content {
288
+ display: flex;
289
+ flex-direction: column;
290
+ gap: 16px;
291
+ }
292
+
293
+ .taskon-pending-dialog-title {
294
+ margin: 0;
295
+ font-size: 16px;
296
+ line-height: 24px;
297
+ color: var(--taskon-text-color, #ffffff);
298
+ }
299
+
300
+ .taskon-pending-dialog-desc {
301
+ margin: 0;
302
+ font-size: 14px;
303
+ line-height: 20px;
304
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
305
+ }
306
+
307
+ .taskon-pending-dialog-hash-wrap {
308
+ display: flex;
309
+ flex-wrap: wrap;
310
+ align-items: center;
311
+ gap: 8px;
312
+ }
313
+
314
+ .taskon-pending-dialog-hash-label {
315
+ font-size: 14px;
316
+ color: var(--taskon-text-secondary, rgba(255, 255, 255, 0.7));
317
+ }
318
+
319
+ .taskon-pending-dialog-hash-link,
320
+ .taskon-pending-dialog-hash-value {
321
+ font-size: 14px;
322
+ color: var(--taskon-uc-color-link, #ffd465);
323
+ text-decoration: underline;
324
+ background: none;
325
+ border: none;
326
+ padding: 0;
327
+ }
328
+
329
+ .taskon-pending-dialog-hash-link {
330
+ cursor: pointer;
331
+ }
332
+
333
+ .taskon-pending-dialog-notice-list {
334
+ margin: 0;
335
+ padding-left: 18px;
336
+ list-style: disc;
337
+ display: flex;
338
+ flex-direction: column;
339
+ gap: 10px;
340
+ }
341
+
342
+ .taskon-pending-dialog-notice-item {
343
+ font-size: 12px;
344
+ line-height: 18px;
345
+ color: var(--taskon-uc-color-link, #ffd465);
346
+ }
347
+
348
+ .taskon-pending-dialog-receive-address {
349
+ margin-top: 4px;
350
+ word-break: break-all;
351
+ }
352
+
353
+ .taskon-pending-dialog-actions {
354
+ display: flex;
355
+ justify-content: flex-end;
356
+ gap: 12px;
357
+ margin-top: 8px;
358
+ }
359
+
360
+ .taskon-pending-dialog-btn {
361
+ padding: 10px 18px;
362
+ border-radius: 8px;
363
+ border: none;
364
+ font-size: 14px;
365
+ font-weight: 500;
366
+ cursor: pointer;
367
+ transition: all 0.2s ease;
368
+ }
369
+
370
+ .taskon-pending-dialog-btn--primary {
371
+ background: var(--taskon-primary-color, #ffd465);
372
+ color: #18181b;
373
+ }
374
+
375
+ .taskon-pending-dialog-btn--primary:hover {
376
+ opacity: 0.92;
377
+ }
378
+
379
+ .taskon-pending-dialog-btn--secondary {
380
+ background: transparent;
381
+ color: var(--taskon-text-color, #ffffff);
382
+ border: 1px solid var(--taskon-uc-color-border-btn, rgba(255, 255, 255, 0.1));
383
+ }
384
+
385
+ .taskon-pending-dialog-btn--secondary:hover {
386
+ background: rgba(255, 255, 255, 0.06);
387
+ }
388
+ /**
389
+ * BindWalletDialog 组件样式
390
+ * 使用 taskon-bind-wallet-* 命名空间
391
+ * 与 taskon-website 保持一致
392
+ */
393
+
394
+ /* ==================== 容器 ==================== */
395
+ .taskon-bind-wallet-dialog {
396
+ position: relative;
397
+ display: flex;
398
+ flex-direction: column;
399
+ }
400
+
401
+ /* ==================== 标题 ==================== */
402
+ .taskon-bind-wallet-dialog-title {
403
+ margin: 0;
404
+ font-size: 22px;
405
+ font-weight: 700;
406
+ line-height: 28px;
407
+ color: var(--taskon-color-text);
408
+ }
409
+
410
+ /* ==================== 链类型标签 ==================== */
411
+ .taskon-bind-wallet-dialog-chain-label {
412
+ margin-top: 20px;
413
+ font-size: 16px;
414
+ font-weight: 500;
415
+ line-height: 20px;
416
+ color: var(--taskon-color-text);
417
+ }
418
+
419
+ /* ==================== 钱包网格 ==================== */
420
+ .taskon-bind-wallet-dialog-grid {
421
+ margin-top: 10px;
422
+ display: grid;
423
+ grid-template-columns: 1fr 1fr;
424
+ gap: 18px;
425
+ }
426
+
427
+ /* ==================== 钱包项 ==================== */
428
+ .taskon-bind-wallet-item {
429
+ position: relative;
430
+ display: flex;
431
+ align-items: center;
432
+ justify-content: center;
433
+ height: 50px;
434
+ padding: 0 12px;
435
+
436
+ background: transparent;
437
+ border: 1px solid var(--taskon-color-border);
438
+ border-radius: 8px;
439
+ cursor: pointer;
440
+ transition: all 0.2s ease;
441
+ }
442
+
443
+ .taskon-bind-wallet-item:hover,
444
+ .taskon-bind-wallet-item:focus {
445
+ background: var(--taskon-color-bg-surface-strong);
446
+ }
447
+
448
+ .taskon-bind-wallet-item:active {
449
+ transform: scale(0.98);
450
+ }
451
+
452
+ /* 钱包图标 */
453
+ .taskon-bind-wallet-item-icon {
454
+ display: flex;
455
+ align-items: center;
456
+ justify-content: center;
457
+ width: 24px;
458
+ height: 24px;
459
+ flex-shrink: 0;
460
+ }
461
+
462
+ .taskon-bind-wallet-item-icon svg {
463
+ width: 24px;
464
+ height: 24px;
465
+ }
466
+
467
+ /* 钱包名称 */
468
+ .taskon-bind-wallet-item-name {
469
+ margin-left: 10px;
470
+ font-size: 18px;
471
+ font-weight: 600;
472
+ line-height: 20px;
473
+ color: var(--taskon-color-text);
474
+ }
475
+
476
+ /* 已安装标签 */
477
+ .taskon-bind-wallet-item-installed {
478
+ position: absolute;
479
+ right: 0;
480
+ bottom: 0;
481
+ padding: 4px 8px;
482
+ font-size: 10px;
483
+ line-height: 14px;
484
+ color: var(--taskon-color-secondary);
485
+ background: var(--taskon-color-secondary-bg);
486
+ border-radius: 8px 0;
487
+ transform-origin: bottom right;
488
+ }
489
+
490
+ /* ==================== 连接中状态 ==================== */
491
+ .taskon-bind-wallet-item--connecting {
492
+ opacity: 0.7;
493
+ cursor: wait;
494
+ }
495
+
496
+ .taskon-bind-wallet-item--connecting:hover,
497
+ .taskon-bind-wallet-item--connecting:focus {
498
+ background: transparent;
499
+ }
500
+
501
+ /* ==================== 禁用状态 ==================== */
502
+ .taskon-bind-wallet-item--disabled {
503
+ opacity: 0.5;
504
+ cursor: not-allowed;
505
+ }
506
+
507
+ .taskon-bind-wallet-item--disabled:hover,
508
+ .taskon-bind-wallet-item--disabled:focus {
509
+ background: transparent;
510
+ }
511
+
512
+ .taskon-bind-wallet-item--disabled:active {
513
+ transform: none;
514
+ }
515
+
516
+ /* 不可用标签 */
517
+ .taskon-bind-wallet-item-unavailable {
518
+ position: absolute;
519
+ right: 0;
520
+ bottom: 0;
521
+ padding: 4px 8px;
522
+ font-size: 10px;
523
+ line-height: 14px;
524
+ color: var(--taskon-color-text-tertiary);
525
+ background: var(--taskon-color-bg-surface-subtle);
526
+ border-radius: 8px 0;
527
+ }
528
+
529
+ /* 连接中 spinner */
530
+ .taskon-bind-wallet-item-connecting {
531
+ position: absolute;
532
+ right: 8px;
533
+ display: flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ }
537
+
538
+ .taskon-bind-wallet-spinner {
539
+ width: 16px;
540
+ height: 16px;
541
+ color: var(--taskon-color-primary);
542
+ animation: taskon-bind-wallet-spin 1s linear infinite;
543
+ }
544
+
545
+ @keyframes taskon-bind-wallet-spin {
546
+ from {
547
+ transform: rotate(0deg);
548
+ }
549
+ to {
550
+ transform: rotate(360deg);
551
+ }
552
+ }
553
+
554
+ /* ==================== 提示文字 ==================== */
555
+ .taskon-bind-wallet-dialog-tip {
556
+ margin: 20px 0 0;
557
+ font-size: 14px;
558
+ line-height: 1.5;
559
+ color: var(--taskon-color-text-tertiary);
560
+ text-align: center;
561
+ }
562
+
563
+ /* ==================== 响应式 ==================== */
564
+ @media (max-width: 750px) {
565
+ .taskon-bind-wallet-dialog-title {
566
+ font-size: 3.8vw;
567
+ line-height: 4vw;
568
+ }
569
+
570
+ .taskon-bind-wallet-dialog-chain-label {
571
+ margin-top: 4vw;
572
+ font-size: 4vw;
573
+ line-height: 5.6vw;
574
+ }
575
+
576
+ .taskon-bind-wallet-dialog-grid {
577
+ margin-top: 2.667vw;
578
+ grid-template-columns: 1fr;
579
+ gap: 4vw;
580
+ }
581
+
582
+ .taskon-bind-wallet-item {
583
+ height: 12vw;
584
+ }
585
+
586
+ .taskon-bind-wallet-item-icon {
587
+ width: 6.4vw;
588
+ height: 6.4vw;
589
+ }
590
+
591
+ .taskon-bind-wallet-item-icon svg {
592
+ width: 6.4vw;
593
+ height: 6.4vw;
594
+ }
595
+
596
+ .taskon-bind-wallet-item-name {
597
+ margin-left: 2.667vw;
598
+ font-size: 3.733vw;
599
+ line-height: 4.667vw;
600
+ }
601
+
602
+ .taskon-bind-wallet-dialog-tip {
603
+ margin-top: 4vw;
604
+ font-size: 3vw;
605
+ }
606
+ }
607
+
608
+ /* ==================== 连接中遮层 ==================== */
609
+ .taskon-bind-wallet-loading-overlay {
610
+ position: absolute;
611
+ /* 使用负值覆盖 Dialog body 的 padding */
612
+ inset: -24px;
613
+ display: flex;
614
+ flex-direction: column;
615
+ align-items: center;
616
+ justify-content: center;
617
+ background: var(--taskon-color-bg-mask);
618
+ backdrop-filter: blur(4px);
619
+ border-radius: 16px;
620
+ }
621
+
622
+ .taskon-bind-wallet-loading-spinner {
623
+ width: 40px;
624
+ height: 40px;
625
+ color: var(--taskon-color-text-secondary);
626
+ animation: taskon-bind-wallet-spin 1s linear infinite;
627
+ }
628
+
629
+ .taskon-bind-wallet-loading-text {
630
+ margin: 20px 0 0;
631
+ max-width: 60%;
632
+ font-size: 16px;
633
+ line-height: 20px;
634
+ color: var(--taskon-color-text-secondary);
635
+ text-align: center;
636
+ }
637
+
638
+ @media (max-width: 750px) {
639
+ .taskon-bind-wallet-loading-overlay {
640
+ inset: -20px;
641
+ border-radius: 12px;
642
+ }
643
+
644
+ .taskon-bind-wallet-loading-spinner {
645
+ width: 8vw;
646
+ height: 8vw;
647
+ }
648
+
649
+ .taskon-bind-wallet-loading-text {
650
+ margin-top: 4vw;
651
+ font-size: 3.5vw;
652
+ line-height: 5vw;
653
+ }
654
+ }
655
+ /**
656
+ * TipPopover 组件样式
657
+ * 设计原则:组件内部不包含 margin,需要间距由外部控制
658
+ */
659
+
660
+ .taskon-tip-popover-trigger {
661
+ display: inline-flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ padding: 0;
665
+ border: none;
666
+ background: transparent;
667
+ cursor: pointer;
668
+ color: var(--taskon-color-text-tertiary);
669
+ outline: none;
670
+ }
671
+
672
+ .taskon-tip-popover-trigger:hover,
673
+ .taskon-tip-popover-trigger:focus {
674
+ color: var(--taskon-color-text-tertiary);
675
+ background: transparent;
676
+ outline: none;
677
+ }
678
+
679
+ /* Custom children trigger - reset button styles */
680
+ .taskon-tip-popover-trigger--custom {
681
+ cursor: pointer;
682
+ }
683
+
684
+ .taskon-tip-popover-content {
685
+ max-width: 266px;
686
+ padding: 12px 16px;
687
+ border-radius: var(--taskon-border-radius-sm);
688
+ border: none;
689
+ outline: none;
690
+ background: var(--taskon-color-bg-floating);
691
+ color: var(--taskon-color-text);
692
+ font-size: 13px;
693
+ line-height: 1.5;
694
+ box-shadow: 0 4px 16px var(--taskon-color-bg-mask);
695
+ /* z-index 需要大于 Dialog (9999) 才能在弹窗中正常显示 */
696
+ z-index: 10000;
697
+ animation: taskon-tip-popover-fade-in 0.15s ease;
698
+ }
699
+
700
+ .taskon-tip-popover-content:focus {
701
+ outline: none;
702
+ }
703
+
704
+ .taskon-tip-popover-arrow {
705
+ fill: var(--taskon-color-bg-floating);
706
+ }
707
+
708
+ @keyframes taskon-tip-popover-fade-in {
709
+ from {
710
+ opacity: 0;
711
+ transform: scale(0.96);
712
+ }
713
+ to {
714
+ opacity: 1;
715
+ transform: scale(1);
716
+ }
717
+ }
718
+
719
+ /* Mobile styles */
720
+ @media (max-width: 750px) {
721
+ .taskon-tip-popover-content {
722
+ max-width: 60vw;
723
+ padding: 2.5vw 3.5vw;
724
+ font-size: 3vw;
725
+ }
726
+ }
1
727
  /**
2
728
  * Select 组件样式
3
729
  *
4
730
  * 基于 Vue ProSelect 组件样式翻译
5
- * 使用 taskon-select 命名空间避免样式冲突
731
+ * 使用 taskon-select 命名空间避免样式冲突。
732
+ *
733
+ * 主题规范:
734
+ * - 不再定义组件私有主题变量
735
+ * - 统一使用 ThemeProvider 输出的通用 --taskon-* 变量
6
736
  */
7
737
 
8
738
  /* ========== 根容器 ========== */
9
739
  .taskon-select {
10
- --select-height: 44px;
11
- --select-min-width: 120px;
12
- --select-padding: 0 12px;
13
- --select-background: rgba(255, 255, 255, 0.05);
14
- --select-hover-background: rgba(255, 255, 255, 0.08);
15
- --select-focus-background: rgba(255, 255, 255, 0.08);
16
- --select-color: #fff;
17
- --select-placeholder-color: rgba(255, 255, 255, 0.5);
18
- --select-border: 1px solid rgba(255, 255, 255, 0.1);
19
- --select-hover-border: 1px solid rgba(255, 255, 255, 0.2);
20
- --select-focus-border: 1px solid rgba(255, 255, 255, 0.3);
21
- --select-border-radius: 8px;
22
- --select-font-size: 14px;
23
- --select-line-height: 20px;
24
- --select-z-index: 9999;
25
- --select-menu-background: #343a3d;
26
- --select-menu-border: 1px solid rgba(255, 255, 255, 0.1);
27
- --select-menu-border-radius: 8px;
28
- --select-option-padding: 15px 20px;
29
- --select-option-hover-background: #424a4d;
30
- --select-option-color: #fff;
31
- --select-option-desc-color: rgba(255, 255, 255, 0.6);
32
-
33
740
  position: relative;
34
741
  display: inline-block;
35
742
  width: 100%;
@@ -45,15 +752,15 @@
45
752
  .taskon-select__trigger {
46
753
  display: flex;
47
754
  align-items: center;
48
- height: var(--select-height);
49
- min-width: var(--select-min-width);
50
- padding: var(--select-padding);
51
- background: var(--select-background);
52
- color: var(--select-color);
53
- font-size: var(--select-font-size);
54
- line-height: var(--select-line-height);
55
- border: var(--select-border);
56
- border-radius: var(--select-border-radius);
755
+ height: 44px;
756
+ min-width: 120px;
757
+ padding: 0 12px;
758
+ background: var(--taskon-color-bg-surface-subtle);
759
+ color: var(--taskon-color-text);
760
+ font-size: var(--taskon-font-size);
761
+ line-height: 20px;
762
+ border: 1px solid var(--taskon-color-border);
763
+ border-radius: var(--taskon-border-radius-sm);
57
764
  cursor: pointer;
58
765
  transition:
59
766
  background 0.2s,
@@ -63,18 +770,18 @@
63
770
  }
64
771
 
65
772
  .taskon-select__trigger:hover:not(.taskon-select__trigger--disabled) {
66
- background: var(--select-hover-background);
67
- border: var(--select-hover-border);
773
+ background: var(--taskon-color-bg-surface);
774
+ border-color: var(--taskon-color-border-secondary);
68
775
  }
69
776
 
70
777
  .taskon-select__trigger:focus:not(.taskon-select__trigger--disabled) {
71
- background: var(--select-focus-background);
72
- border: var(--select-focus-border);
778
+ background: var(--taskon-color-bg-surface);
779
+ border-color: var(--taskon-color-border-secondary);
73
780
  }
74
781
 
75
782
  .taskon-select__trigger--open {
76
- background: var(--select-focus-background);
77
- border: var(--select-focus-border);
783
+ background: var(--taskon-color-bg-surface);
784
+ border-color: var(--taskon-color-border-secondary);
78
785
  }
79
786
 
80
787
  .taskon-select__trigger--disabled {
@@ -83,35 +790,43 @@
83
790
  }
84
791
 
85
792
  .taskon-select__trigger--error {
86
- border-color: #f55 !important;
793
+ border-color: var(--taskon-color-error) !important;
87
794
  }
88
795
 
89
796
  /* 深色主题 */
90
797
  .taskon-select__trigger--dark {
91
- --select-background: #2a2f32;
92
- --select-hover-background: #343a3d;
93
- --select-focus-background: #343a3d;
798
+ background: var(--taskon-color-bg-surface);
94
799
  }
95
800
 
96
801
  /* 浅色主题 */
97
802
  .taskon-select__trigger--light {
98
- --select-background: #fff;
99
- --select-hover-background: #f5f5f5;
100
- --select-focus-background: #f0f0f0;
101
- --select-color: #333;
102
- --select-placeholder-color: #999;
103
- --select-border: 1px solid #e5e5e5;
104
- --select-hover-border: 1px solid #ccc;
105
- --select-focus-border: 1px solid #999;
803
+ background: var(--taskon-color-bg-surface);
804
+ color: var(--taskon-color-text);
805
+ border-color: var(--taskon-color-border);
806
+ }
807
+
808
+ .taskon-select__trigger--light:hover:not(.taskon-select__trigger--disabled) {
809
+ background: var(--taskon-color-bg-surface-strong);
810
+ border-color: var(--taskon-color-border-secondary);
811
+ }
812
+
813
+ .taskon-select__trigger--light:focus:not(.taskon-select__trigger--disabled),
814
+ .taskon-select__trigger--light.taskon-select__trigger--open {
815
+ background: var(--taskon-color-bg-surface-strong);
816
+ border-color: var(--taskon-color-border-secondary);
106
817
  }
107
818
 
108
819
  /* 卡片主题 */
109
820
  .taskon-select__trigger--card {
110
- --select-background: transparent;
111
- --select-hover-background: rgba(255, 255, 255, 0.05);
112
- --select-border: none;
113
- --select-hover-border: none;
114
- --select-focus-border: none;
821
+ background: transparent;
822
+ border: none;
823
+ }
824
+
825
+ .taskon-select__trigger--card:hover:not(.taskon-select__trigger--disabled),
826
+ .taskon-select__trigger--card:focus:not(.taskon-select__trigger--disabled),
827
+ .taskon-select__trigger--card.taskon-select__trigger--open {
828
+ background: var(--taskon-color-bg-surface-subtle);
829
+ border: none;
115
830
  }
116
831
 
117
832
  /* ========== 触发器图标 ========== */
@@ -135,14 +850,14 @@
135
850
  /* ========== 触发器占位符 ========== */
136
851
  .taskon-select__trigger-placeholder {
137
852
  flex: 1;
138
- color: var(--select-placeholder-color);
853
+ color: var(--taskon-color-text-secondary);
139
854
  text-align: left;
140
855
  }
141
856
 
142
857
  /* ========== 展开图标 ========== */
143
858
  .taskon-select__unfold-icon {
144
859
  margin-left: 10px;
145
- color: var(--select-color);
860
+ color: currentColor;
146
861
  opacity: 0.6;
147
862
  transition: transform 0.2s;
148
863
  flex-shrink: 0;
@@ -154,58 +869,45 @@
154
869
 
155
870
  /* ========== 下拉菜单 ========== */
156
871
  .taskon-select__menu {
157
- /* Portal 模式下需要独立定义变量,因为不在 .taskon-select 内部 */
158
- --select-menu-background: #343a3d;
159
- --select-menu-border: 1px solid rgba(255, 255, 255, 0.1);
160
- --select-menu-border-radius: 8px;
161
- --select-option-padding: 15px 20px;
162
- --select-option-hover-background: #424a4d;
163
- --select-option-color: #fff;
164
- --select-option-desc-color: rgba(255, 255, 255, 0.6);
165
-
166
872
  position: absolute;
167
873
  top: 100%;
168
874
  left: 0;
169
875
  right: 0;
170
876
  margin-top: 4px;
171
- background: var(--select-menu-background);
172
- border: var(--select-menu-border);
173
- border-radius: var(--select-menu-border-radius);
877
+ background: var(--taskon-color-bg-floating);
878
+ border: 1px solid var(--taskon-color-border);
879
+ border-radius: var(--taskon-border-radius-sm);
174
880
  overflow: auto;
175
881
  z-index: 9999;
176
882
  }
177
883
 
178
884
  /* 深色主题 */
179
885
  .taskon-select__menu--dark {
180
- --select-menu-background: #2a2f32;
181
- --select-option-hover-background: #3a4144;
886
+ background: var(--taskon-color-bg-floating);
182
887
  }
183
888
 
184
889
  /* 浅色主题 */
185
890
  .taskon-select__menu--light {
186
- --select-menu-background: #fff;
187
- --select-menu-border: 1px solid #e5e5e5;
188
- --select-option-color: #333;
189
- --select-option-hover-background: #f5f5f5;
190
- --select-option-desc-color: #999;
891
+ background: var(--taskon-color-bg-floating);
892
+ border-color: var(--taskon-color-border);
191
893
  }
192
894
 
193
895
  /* ========== 选项 ========== */
194
896
  .taskon-select__option {
195
897
  display: flex;
196
898
  align-items: center;
197
- padding: var(--select-option-padding);
198
- color: var(--select-option-color);
899
+ padding: 15px 20px;
900
+ color: var(--taskon-color-text);
199
901
  cursor: pointer;
200
902
  transition: background 0.15s;
201
903
  }
202
904
 
203
905
  .taskon-select__option:hover:not(.taskon-select__option--disabled) {
204
- background: var(--select-option-hover-background);
906
+ background: var(--taskon-color-bg-surface);
205
907
  }
206
908
 
207
909
  .taskon-select__option--active {
208
- background: rgba(255, 255, 255, 0.05);
910
+ background: var(--taskon-color-bg-surface-subtle);
209
911
  }
210
912
 
211
913
  .taskon-select__option--disabled {
@@ -214,7 +916,7 @@
214
916
  }
215
917
 
216
918
  .taskon-select__option--danger .taskon-select__option-label {
217
- color: #f55;
919
+ color: var(--taskon-color-error);
218
920
  }
219
921
 
220
922
  /* ========== 选项图标 ========== */
@@ -246,14 +948,30 @@
246
948
  .taskon-select__option-desc {
247
949
  font-size: 12px;
248
950
  line-height: 16px;
249
- color: var(--select-option-desc-color);
951
+ color: var(--taskon-color-text-secondary);
250
952
  margin-top: 2px;
251
953
  }
252
954
 
955
+ .taskon-select__menu--light .taskon-select__option {
956
+ color: var(--taskon-color-text);
957
+ }
958
+
959
+ .taskon-select__menu--light .taskon-select__option:hover:not(.taskon-select__option--disabled) {
960
+ background: var(--taskon-color-bg-surface);
961
+ }
962
+
963
+ .taskon-select__menu--light .taskon-select__option--active {
964
+ background: var(--taskon-color-bg-surface-strong);
965
+ }
966
+
967
+ .taskon-select__menu--light .taskon-select__option-desc {
968
+ color: var(--taskon-color-text-secondary);
969
+ }
970
+
253
971
  /* ========== 选中勾选图标 ========== */
254
972
  .taskon-select__option-check {
255
973
  margin-left: 8px;
256
- color: #4caf50;
974
+ color: var(--taskon-color-success);
257
975
  flex-shrink: 0;
258
976
  }
259
977
 
@@ -261,7 +979,7 @@
261
979
  .taskon-select__empty {
262
980
  padding: 20px;
263
981
  text-align: center;
264
- color: rgba(255, 255, 255, 0.5);
982
+ color: var(--taskon-color-text-secondary);
265
983
  font-size: 14px;
266
984
  }
267
985
 
@@ -269,15 +987,18 @@
269
987
  .taskon-select__error {
270
988
  margin-top: 4px;
271
989
  font-size: 12px;
272
- color: #f55;
990
+ color: var(--taskon-color-error);
273
991
  }
274
992
 
275
993
  /* ========== 响应式 ========== */
276
994
  @media (max-width: 750px) {
277
- .taskon-select {
278
- --select-height: 40px;
279
- --select-font-size: 13px;
280
- --select-option-padding: 12px 16px;
995
+ .taskon-select__trigger {
996
+ height: 40px;
997
+ font-size: 13px;
998
+ }
999
+
1000
+ .taskon-select__option {
1001
+ padding: 12px 16px;
281
1002
  }
282
1003
 
283
1004
  .taskon-select__trigger-icon {
@@ -300,19 +1021,16 @@
300
1021
  * WithdrawSelectOption 组件样式
301
1022
  *
302
1023
  * 基于 Vue WithdrawSelectOption 组件样式翻译
1024
+ * 主题规范:仅使用通用 --taskon-* 变量,不定义局部主题变量
303
1025
  */
304
1026
 
305
1027
  .taskon-withdraw-option {
306
- /* 独立定义变量,确保 Portal 模式下正常工作 */
307
- --option-hover-bg: #424a4d;
308
- --option-color: #fff;
309
-
310
1028
  padding: 15px 6px 15px 20px;
311
1029
  cursor: pointer;
312
1030
  }
313
1031
 
314
1032
  .taskon-withdraw-option:hover {
315
- background: var(--option-hover-bg, #424a4d);
1033
+ background: var(--taskon-color-bg-surface);
316
1034
  }
317
1035
 
318
1036
  /* 禁用状态 */
@@ -351,7 +1069,7 @@
351
1069
 
352
1070
  .taskon-withdraw-option__chain-label {
353
1071
  font-size: 14px;
354
- color: rgba(255, 255, 255, 0.8);
1072
+ color: var(--taskon-color-text-secondary);
355
1073
  overflow: hidden;
356
1074
  text-overflow: ellipsis;
357
1075
  white-space: nowrap;
@@ -377,7 +1095,7 @@
377
1095
  font-weight: 500;
378
1096
  font-size: 14px;
379
1097
  line-height: 20px;
380
- color: var(--option-color, #fff);
1098
+ color: var(--taskon-color-text);
381
1099
  overflow: hidden;
382
1100
  white-space: nowrap;
383
1101
  text-overflow: ellipsis;
@@ -394,13 +1112,13 @@
394
1112
 
395
1113
  .taskon-withdraw-option__balance {
396
1114
  font-size: 14px;
397
- color: rgba(255, 255, 255, 0.5);
1115
+ color: var(--taskon-color-text-tertiary);
398
1116
  }
399
1117
 
400
1118
  .taskon-withdraw-option__check {
401
1119
  width: 12px;
402
1120
  height: 8px;
403
- color: #4caf50;
1121
+ color: var(--taskon-color-success);
404
1122
  visibility: hidden;
405
1123
  }
406
1124
 
@@ -413,7 +1131,7 @@
413
1131
  margin-top: 4px;
414
1132
  font-size: 12px;
415
1133
  font-weight: 400;
416
- color: var(--text-info-warning-60, #ffc107);
1134
+ color: var(--taskon-color-warning);
417
1135
  }
418
1136
 
419
1137
  /* ========== 响应式 ========== */
@@ -724,100 +1442,306 @@
724
1442
  cursor: pointer;
725
1443
  }
726
1444
 
727
- .taskon-switch__label--disabled {
728
- cursor: not-allowed;
1445
+ .taskon-switch__label--disabled {
1446
+ cursor: not-allowed;
1447
+ }
1448
+
1449
+ /* ============================================================================
1450
+ 开关按钮
1451
+ ============================================================================ */
1452
+
1453
+ .taskon-switch__button {
1454
+ position: relative;
1455
+ width: 38px;
1456
+ height: 20px;
1457
+ line-height: 20px;
1458
+ background: #464646;
1459
+ border: 1px solid rgba(255, 255, 255, 0.1);
1460
+ border-radius: 100px;
1461
+ padding: 2px 3px;
1462
+ margin-left: 15px;
1463
+ transition: all 0.3s ease;
1464
+ flex-shrink: 0;
1465
+ }
1466
+
1467
+ /* 开启状态 - 默认渐变背景 */
1468
+ .taskon-switch__button--active {
1469
+ background: linear-gradient(89.87deg, #cbff01 0.13%, #00ffa3 99.92%);
1470
+ border-color: transparent;
1471
+ }
1472
+
1473
+ /* 禁用状态 */
1474
+ .taskon-switch__button--disabled {
1475
+ cursor: not-allowed;
1476
+ }
1477
+
1478
+ /* ============================================================================
1479
+ 滑块
1480
+ ============================================================================ */
1481
+
1482
+ .taskon-switch__slider {
1483
+ width: 14px;
1484
+ height: 14px;
1485
+ border-radius: 50%;
1486
+ background: #fff;
1487
+ transition: margin-left 0.3s ease;
1488
+ }
1489
+
1490
+ /* 开启状态的滑块位置 */
1491
+ .taskon-switch__button--active .taskon-switch__slider {
1492
+ margin-left: 18px;
1493
+ background: #25292c;
1494
+ }
1495
+
1496
+ /* ============================================================================
1497
+ 高亮样式 (highlight type)
1498
+ ============================================================================ */
1499
+
1500
+ .taskon-switch--highlight .taskon-switch__button {
1501
+ background: rgba(70, 70, 70, 0.2);
1502
+ }
1503
+
1504
+ .taskon-switch--highlight .taskon-switch__button--active {
1505
+ background: rgba(203, 255, 1, 0.1);
1506
+ border: 1px solid rgba(255, 255, 255, 0.06);
1507
+ }
1508
+
1509
+ .taskon-switch--highlight .taskon-switch__button--active .taskon-switch__slider {
1510
+ background: #cbff01;
1511
+ }
1512
+
1513
+ /* ============================================================================
1514
+ 响应式 - 移动端适配
1515
+ ============================================================================ */
1516
+
1517
+ @media (max-width: 750px) {
1518
+ .taskon-switch {
1519
+ font-weight: 500;
1520
+ font-size: 12px;
1521
+ line-height: 130%;
1522
+ }
1523
+
1524
+ .taskon-switch__button {
1525
+ width: 32px;
1526
+ height: 18px;
1527
+ padding: 2px;
1528
+ margin-left: 10px;
1529
+ }
1530
+
1531
+ .taskon-switch__slider {
1532
+ width: 12px;
1533
+ height: 12px;
1534
+ }
1535
+
1536
+ .taskon-switch__button--active .taskon-switch__slider {
1537
+ margin-left: 14px;
1538
+ }
1539
+ }
1540
+ /**
1541
+ * Points 表格样式
1542
+ *
1543
+ * 从 UserCenterWidget.css 拆分,便于独立使用
1544
+ */
1545
+
1546
+ /* ========== Points List ========== */
1547
+ .taskon-points-list {
1548
+ width: 100%;
1549
+ }
1550
+
1551
+ .taskon-points-list__header {
1552
+ display: flex;
1553
+ align-items: center;
1554
+ gap: var(--taskon-spacing-sm, 8px);
1555
+ margin-bottom: var(--taskon-spacing-md, 16px);
1556
+ }
1557
+
1558
+ .taskon-points-list__icon {
1559
+ width: 32px;
1560
+ height: 32px;
1561
+ border-radius: 50%;
1562
+ object-fit: cover;
1563
+ }
1564
+
1565
+ .taskon-points-list__title {
1566
+ font-size: 16px;
1567
+ font-weight: 600;
1568
+ color: var(--taskon-color-text, #1f2937);
1569
+ margin: 0;
1570
+ }
1571
+
1572
+ .taskon-points-list__total {
1573
+ display: flex;
1574
+ align-items: baseline;
1575
+ gap: var(--taskon-spacing-xs, 4px);
1576
+ margin-left: auto;
1577
+ }
1578
+
1579
+ .taskon-points-list__total-value {
1580
+ font-size: 20px;
1581
+ font-weight: 700;
1582
+ color: var(--taskon-color-text, #1f2937);
1583
+ }
1584
+
1585
+ .taskon-points-list__total-label {
1586
+ font-size: 12px;
1587
+ color: var(--taskon-color-text-secondary, #6b7280);
1588
+ }
1589
+
1590
+ .taskon-points-list__table {
1591
+ width: 100%;
1592
+ border: 1px solid var(--taskon-color-border, #e5e7eb);
1593
+ border-radius: var(--taskon-border-radius-sm, 6px);
1594
+ overflow: hidden;
1595
+ }
1596
+
1597
+ .taskon-points-list__row {
1598
+ display: flex;
1599
+ align-items: center;
1600
+ padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-md, 16px);
1601
+ border-bottom: 1px solid var(--taskon-color-border, #e5e7eb);
1602
+ transition: background-color 0.2s ease;
1603
+ }
1604
+
1605
+ .taskon-points-list__row:last-child {
1606
+ border-bottom: none;
1607
+ }
1608
+
1609
+ .taskon-points-list__row:hover {
1610
+ background-color: var(--taskon-color-bg-hover, #f3f4f6);
1611
+ }
1612
+
1613
+ .taskon-points-list__cell {
1614
+ display: flex;
1615
+ align-items: center;
1616
+ }
1617
+
1618
+ .taskon-points-list__cell--main {
1619
+ flex: 1;
1620
+ display: flex;
1621
+ flex-direction: column;
1622
+ gap: 2px;
1623
+ overflow: hidden;
1624
+ }
1625
+
1626
+ .taskon-points-list__cell--amount {
1627
+ font-size: 14px;
1628
+ font-weight: 600;
1629
+ white-space: nowrap;
1630
+ }
1631
+
1632
+ .taskon-points-list__cell--amount.positive {
1633
+ color: var(--taskon-color-success, #10b981);
1634
+ }
1635
+
1636
+ .taskon-points-list__cell--amount.negative {
1637
+ color: var(--taskon-color-error, #ef4444);
1638
+ }
1639
+
1640
+ .taskon-points-list__cell--time {
1641
+ font-size: 13px;
1642
+ color: var(--taskon-color-text-secondary, #6b7280);
1643
+ white-space: nowrap;
1644
+ }
1645
+
1646
+ .taskon-points-list__primary {
1647
+ font-size: 14px;
1648
+ font-weight: 500;
1649
+ color: var(--taskon-color-text, #1f2937);
1650
+ white-space: nowrap;
1651
+ overflow: hidden;
1652
+ text-overflow: ellipsis;
1653
+ }
1654
+
1655
+ .taskon-points-list__secondary {
1656
+ font-size: 12px;
1657
+ color: var(--taskon-color-text-secondary, #6b7280);
1658
+ white-space: nowrap;
1659
+ overflow: hidden;
1660
+ text-overflow: ellipsis;
1661
+ }
1662
+
1663
+ .taskon-points-list__loading-more {
1664
+ display: flex;
1665
+ justify-content: center;
1666
+ padding: var(--taskon-spacing-md, 16px);
729
1667
  }
730
1668
 
731
- /* ============================================================================
732
- 开关按钮
733
- ============================================================================ */
734
-
735
- .taskon-switch__button {
736
- position: relative;
737
- width: 38px;
738
- height: 20px;
739
- line-height: 20px;
740
- background: #464646;
741
- border: 1px solid rgba(255, 255, 255, 0.1);
742
- border-radius: 100px;
743
- padding: 2px 3px;
744
- margin-left: 15px;
745
- transition: all 0.3s ease;
746
- flex-shrink: 0;
1669
+ .taskon-points-list__table-wrap {
1670
+ margin-top: var(--taskon-spacing-md, 16px);
747
1671
  }
748
1672
 
749
- /* 开启状态 - 默认渐变背景 */
750
- .taskon-switch__button--active {
751
- background: linear-gradient(89.87deg, #cbff01 0.13%, #00ffa3 99.92%);
752
- border-color: transparent;
1673
+ .taskon-points-list__name {
1674
+ font-size: 14px;
1675
+ font-weight: 500;
1676
+ color: var(--taskon-color-text, #1f2937);
753
1677
  }
754
1678
 
755
- /* 禁用状态 */
756
- .taskon-switch__button--disabled {
757
- cursor: not-allowed;
1679
+ .taskon-points-list__time {
1680
+ font-size: 13px;
1681
+ color: var(--taskon-color-text-secondary, #6b7280);
1682
+ white-space: nowrap;
758
1683
  }
759
1684
 
760
- /* ============================================================================
761
- 滑块
762
- ============================================================================ */
1685
+ .taskon-points-list__amount-cell {
1686
+ display: flex;
1687
+ align-items: center;
1688
+ justify-content: flex-end;
1689
+ gap: 6px;
1690
+ }
763
1691
 
764
- .taskon-switch__slider {
765
- width: 14px;
766
- height: 14px;
1692
+ .taskon-points-list__amount-icon {
1693
+ width: 20px;
1694
+ height: 20px;
767
1695
  border-radius: 50%;
768
- background: #fff;
769
- transition: margin-left 0.3s ease;
1696
+ flex-shrink: 0;
770
1697
  }
771
1698
 
772
- /* 开启状态的滑块位置 */
773
- .taskon-switch__button--active .taskon-switch__slider {
774
- margin-left: 18px;
775
- background: #25292c;
1699
+ .taskon-points-list__amount-value {
1700
+ font-size: 14px;
1701
+ font-weight: 600;
1702
+ white-space: nowrap;
776
1703
  }
777
1704
 
778
- /* ============================================================================
779
- 高亮样式 (highlight type)
780
- ============================================================================ */
781
-
782
- .taskon-switch--highlight .taskon-switch__button {
783
- background: rgba(70, 70, 70, 0.2);
1705
+ .taskon-points-list__amount-value--positive {
1706
+ color: var(--taskon-color-success, #10b981);
784
1707
  }
785
1708
 
786
- .taskon-switch--highlight .taskon-switch__button--active {
787
- background: rgba(203, 255, 1, 0.1);
788
- border: 1px solid rgba(255, 255, 255, 0.06);
1709
+ .taskon-points-list__amount-value--negative {
1710
+ color: var(--taskon-color-error, #ef4444);
789
1711
  }
1712
+ /**
1713
+ * AssetImage 组件样式
1714
+ */
790
1715
 
791
- .taskon-switch--highlight .taskon-switch__button--active .taskon-switch__slider {
792
- background: #cbff01;
1716
+ .taskon-asset-image {
1717
+ position: relative;
1718
+ flex-shrink: 0;
793
1719
  }
794
1720
 
795
- /* ============================================================================
796
- 响应式 - 移动端适配
797
- ============================================================================ */
798
-
799
- @media (max-width: 750px) {
800
- .taskon-switch {
801
- font-weight: 500;
802
- font-size: 12px;
803
- line-height: 130%;
804
- }
805
-
806
- .taskon-switch__button {
807
- width: 32px;
808
- height: 18px;
809
- padding: 2px;
810
- margin-left: 10px;
811
- }
1721
+ .taskon-asset-image__main {
1722
+ display: block;
1723
+ width: 100%;
1724
+ height: 100%;
1725
+ border-radius: 4px;
1726
+ object-fit: cover;
1727
+ }
812
1728
 
813
- .taskon-switch__slider {
814
- width: 12px;
815
- height: 12px;
816
- }
1729
+ .taskon-asset-image__placeholder {
1730
+ width: 100%;
1731
+ height: 100%;
1732
+ border-radius: 4px;
1733
+ background-color: var(--taskon-bg-secondary, #f0f0f0);
1734
+ }
817
1735
 
818
- .taskon-switch__button--active .taskon-switch__slider {
819
- margin-left: 14px;
820
- }
1736
+ .taskon-asset-image__chain {
1737
+ position: absolute;
1738
+ right: -4px;
1739
+ bottom: -4px;
1740
+ width: 18px;
1741
+ height: 18px;
1742
+ border-radius: 50%;
1743
+ background-color: var(--taskon-bg-primary, #fff);
1744
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
821
1745
  }
822
1746
  /**
823
1747
  * RewardTables 通用样式
@@ -919,6 +1843,11 @@
919
1843
  .taskon-reward-table__points-amount--negative {
920
1844
  color: var(--taskon-error, #ef4444);
921
1845
  }
1846
+ /**
1847
+ * TokenHistoryTable 表格样式
1848
+ *
1849
+ * 从 RewardTables.css 拆分,便于独立使用
1850
+ */
922
1851
 
923
1852
  /* ========== Token History 表格样式 ========== */
924
1853
 
@@ -1368,8 +2297,8 @@
1368
2297
  --taskon-uc-color-border: rgba(255, 255, 255, 0.04);
1369
2298
  --taskon-uc-color-border-btn: rgba(255, 255, 255, 0.1);
1370
2299
 
1371
- /* 强调色 */
1372
- --taskon-uc-color-link: #ffd465;
2300
+ /* 强调色 */
2301
+ --taskon-uc-color-link: var(--taskon-color-link, #ffd465);
1373
2302
 
1374
2303
  /* 间距系统 (基于 Figma) */
1375
2304
  --taskon-uc-spacing-xxs: 4px;
@@ -1886,6 +2815,22 @@
1886
2815
  white-space: nowrap;
1887
2816
  }
1888
2817
 
2818
+ /* 冻结资产入口按钮 */
2819
+ .taskon-token-assets__frozen-btn {
2820
+ padding: 0;
2821
+ border: none;
2822
+ background: transparent;
2823
+ color: var(--taskon-uc-color-text-lightest, #ffffff);
2824
+ text-decoration: underline;
2825
+ cursor: pointer;
2826
+ font-size: 14px;
2827
+ font-weight: 500;
2828
+ }
2829
+
2830
+ .taskon-token-assets__frozen-btn:hover {
2831
+ color: var(--taskon-uc-color-text-light, rgba(255, 255, 255, 0.8));
2832
+ }
2833
+
1889
2834
  /* 提现按钮(覆盖通用 Button 样式以匹配设计) */
1890
2835
  .taskon-token-assets__withdraw-btn {
1891
2836
  min-width: auto;
@@ -2465,173 +3410,6 @@
2465
3410
  margin-bottom: var(--taskon-spacing-md, 16px);
2466
3411
  }
2467
3412
 
2468
- /* ========== Points List ========== */
2469
- .taskon-points-list {
2470
- width: 100%;
2471
- }
2472
-
2473
- .taskon-points-list__header {
2474
- display: flex;
2475
- align-items: center;
2476
- gap: var(--taskon-spacing-sm, 8px);
2477
- margin-bottom: var(--taskon-spacing-md, 16px);
2478
- }
2479
-
2480
- .taskon-points-list__icon {
2481
- width: 32px;
2482
- height: 32px;
2483
- border-radius: 50%;
2484
- object-fit: cover;
2485
- }
2486
-
2487
- .taskon-points-list__title {
2488
- font-size: 16px;
2489
- font-weight: 600;
2490
- color: var(--taskon-color-text, #1f2937);
2491
- margin: 0;
2492
- }
2493
-
2494
- .taskon-points-list__total {
2495
- display: flex;
2496
- align-items: baseline;
2497
- gap: var(--taskon-spacing-xs, 4px);
2498
- margin-left: auto;
2499
- }
2500
-
2501
- .taskon-points-list__total-value {
2502
- font-size: 20px;
2503
- font-weight: 700;
2504
- color: var(--taskon-color-text, #1f2937);
2505
- }
2506
-
2507
- .taskon-points-list__total-label {
2508
- font-size: 12px;
2509
- color: var(--taskon-color-text-secondary, #6b7280);
2510
- }
2511
-
2512
- .taskon-points-list__table {
2513
- width: 100%;
2514
- border: 1px solid var(--taskon-color-border, #e5e7eb);
2515
- border-radius: var(--taskon-border-radius-sm, 6px);
2516
- overflow: hidden;
2517
- }
2518
-
2519
- .taskon-points-list__row {
2520
- display: flex;
2521
- align-items: center;
2522
- padding: var(--taskon-spacing-sm, 8px) var(--taskon-spacing-md, 16px);
2523
- border-bottom: 1px solid var(--taskon-color-border, #e5e7eb);
2524
- transition: background-color 0.2s ease;
2525
- }
2526
-
2527
- .taskon-points-list__row:last-child {
2528
- border-bottom: none;
2529
- }
2530
-
2531
- .taskon-points-list__row:hover {
2532
- background-color: var(--taskon-color-bg-hover, #f3f4f6);
2533
- }
2534
-
2535
- .taskon-points-list__cell {
2536
- display: flex;
2537
- align-items: center;
2538
- }
2539
-
2540
- .taskon-points-list__cell--main {
2541
- flex: 1;
2542
- display: flex;
2543
- flex-direction: column;
2544
- gap: 2px;
2545
- overflow: hidden;
2546
- }
2547
-
2548
- .taskon-points-list__cell--amount {
2549
- font-size: 14px;
2550
- font-weight: 600;
2551
- white-space: nowrap;
2552
- }
2553
-
2554
- .taskon-points-list__cell--amount.positive {
2555
- color: var(--taskon-color-success, #10b981);
2556
- }
2557
-
2558
- .taskon-points-list__cell--amount.negative {
2559
- color: var(--taskon-color-error, #ef4444);
2560
- }
2561
-
2562
- .taskon-points-list__cell--time {
2563
- font-size: 13px;
2564
- color: var(--taskon-color-text-secondary, #6b7280);
2565
- white-space: nowrap;
2566
- }
2567
-
2568
- .taskon-points-list__primary {
2569
- font-size: 14px;
2570
- font-weight: 500;
2571
- color: var(--taskon-color-text, #1f2937);
2572
- white-space: nowrap;
2573
- overflow: hidden;
2574
- text-overflow: ellipsis;
2575
- }
2576
-
2577
- .taskon-points-list__secondary {
2578
- font-size: 12px;
2579
- color: var(--taskon-color-text-secondary, #6b7280);
2580
- white-space: nowrap;
2581
- overflow: hidden;
2582
- text-overflow: ellipsis;
2583
- }
2584
-
2585
- .taskon-points-list__loading-more {
2586
- display: flex;
2587
- justify-content: center;
2588
- padding: var(--taskon-spacing-md, 16px);
2589
- }
2590
-
2591
- .taskon-points-list__table-wrap {
2592
- margin-top: var(--taskon-spacing-md, 16px);
2593
- }
2594
-
2595
- .taskon-points-list__name {
2596
- font-size: 14px;
2597
- font-weight: 500;
2598
- color: var(--taskon-color-text, #1f2937);
2599
- }
2600
-
2601
- .taskon-points-list__time {
2602
- font-size: 13px;
2603
- color: var(--taskon-color-text-secondary, #6b7280);
2604
- white-space: nowrap;
2605
- }
2606
-
2607
- .taskon-points-list__amount-cell {
2608
- display: flex;
2609
- align-items: center;
2610
- justify-content: flex-end;
2611
- gap: 6px;
2612
- }
2613
-
2614
- .taskon-points-list__amount-icon {
2615
- width: 20px;
2616
- height: 20px;
2617
- border-radius: 50%;
2618
- flex-shrink: 0;
2619
- }
2620
-
2621
- .taskon-points-list__amount-value {
2622
- font-size: 14px;
2623
- font-weight: 600;
2624
- white-space: nowrap;
2625
- }
2626
-
2627
- .taskon-points-list__amount-value--positive {
2628
- color: var(--taskon-color-success, #10b981);
2629
- }
2630
-
2631
- .taskon-points-list__amount-value--negative {
2632
- color: var(--taskon-color-error, #ef4444);
2633
- }
2634
-
2635
3413
  /* ============================================================================
2636
3414
  Identity 组件样式
2637
3415
  ============================================================================ */