@taskon/widget-react 0.0.1-beta.2 → 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 -505
  6. package/dist/TaskOnProvider.css +15 -15
  7. package/dist/UserCenterWidget.css +0 -174
  8. package/dist/UserCenterWidget2.css +870 -102
  9. package/dist/chunks/{CommunityTaskList-BlH1Wdd5.js → CommunityTaskList-C9mPl_31.js} +913 -826
  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-Bw0zSkFh.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-Cw6h_5hT.js → UserCenterWidget-CAhgp46j.js} +204 -1001
  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
  /* ========== 响应式 ========== */
@@ -991,6 +1709,40 @@
991
1709
  .taskon-points-list__amount-value--negative {
992
1710
  color: var(--taskon-color-error, #ef4444);
993
1711
  }
1712
+ /**
1713
+ * AssetImage 组件样式
1714
+ */
1715
+
1716
+ .taskon-asset-image {
1717
+ position: relative;
1718
+ flex-shrink: 0;
1719
+ }
1720
+
1721
+ .taskon-asset-image__main {
1722
+ display: block;
1723
+ width: 100%;
1724
+ height: 100%;
1725
+ border-radius: 4px;
1726
+ object-fit: cover;
1727
+ }
1728
+
1729
+ .taskon-asset-image__placeholder {
1730
+ width: 100%;
1731
+ height: 100%;
1732
+ border-radius: 4px;
1733
+ background-color: var(--taskon-bg-secondary, #f0f0f0);
1734
+ }
1735
+
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);
1745
+ }
994
1746
  /**
995
1747
  * RewardTables 通用样式
996
1748
  */
@@ -1545,8 +2297,8 @@
1545
2297
  --taskon-uc-color-border: rgba(255, 255, 255, 0.04);
1546
2298
  --taskon-uc-color-border-btn: rgba(255, 255, 255, 0.1);
1547
2299
 
1548
- /* 强调色 */
1549
- --taskon-uc-color-link: #ffd465;
2300
+ /* 强调色 */
2301
+ --taskon-uc-color-link: var(--taskon-color-link, #ffd465);
1550
2302
 
1551
2303
  /* 间距系统 (基于 Figma) */
1552
2304
  --taskon-uc-spacing-xxs: 4px;
@@ -2063,6 +2815,22 @@
2063
2815
  white-space: nowrap;
2064
2816
  }
2065
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
+
2066
2834
  /* 提现按钮(覆盖通用 Button 样式以匹配设计) */
2067
2835
  .taskon-token-assets__withdraw-btn {
2068
2836
  min-width: auto;