@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,3 +1,153 @@
1
+ /**
2
+ * ConfirmNoticeDialog styles
3
+ *
4
+ * @description
5
+ * Reproduces the visual rhythm of taskon-website ConfirmNotice:
6
+ * icon -> title -> description -> actions,
7
+ * while intentionally removing the glow background layer.
8
+ */
9
+
10
+ /* Narrow the default dialog body padding for this notice layout */
11
+ .taskon-confirm-notice-dialog .taskon-dialog-body {
12
+ padding: 0;
13
+ }
14
+
15
+ /* ConfirmNotice content root */
16
+ .taskon-confirm-notice {
17
+ position: relative;
18
+ width: 100%;
19
+ max-width: 470px;
20
+ padding: 40px 55px;
21
+ background: var(--taskon-color-bg-popup, #0d0d0d);
22
+ color: var(--taskon-color-text, #ffffff);
23
+ border-radius: 10px;
24
+ text-align: center;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ /* Status icon */
29
+ .taskon-confirm-notice-icon {
30
+ width: 46px;
31
+ height: 46px;
32
+ display: block;
33
+ margin: 0 auto;
34
+ }
35
+
36
+ /* Title */
37
+ .taskon-confirm-notice-title {
38
+ margin: 20px 0 0;
39
+ font-weight: 600;
40
+ font-size: 22px;
41
+ line-height: 28px;
42
+ color: var(--taskon-color-text, #ffffff);
43
+ white-space: pre-wrap;
44
+ }
45
+
46
+ /* Description */
47
+ .taskon-confirm-notice-desc {
48
+ margin: 10px 0 0;
49
+ font-size: 16px;
50
+ line-height: 20px;
51
+ color: var(--taskon-color-text-secondary, rgba(255, 255, 255, 0.7));
52
+ white-space: pre-wrap;
53
+ }
54
+
55
+ /* Action container */
56
+ .taskon-confirm-notice-buttons {
57
+ margin-top: 20px;
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ gap: 10px;
62
+ }
63
+
64
+ .taskon-confirm-notice-buttons--col {
65
+ flex-wrap: wrap;
66
+ }
67
+
68
+ /* Base action button style */
69
+ .taskon-confirm-notice-button {
70
+ min-width: 161px;
71
+ height: 36px;
72
+ padding: 0 16px;
73
+ border-radius: 8px;
74
+ border: 1px solid transparent;
75
+ font-size: 14px;
76
+ font-weight: 600;
77
+ line-height: 36px;
78
+ text-align: center;
79
+ cursor: pointer;
80
+ transition: all 0.2s ease;
81
+ }
82
+
83
+ .taskon-confirm-notice-button:disabled {
84
+ opacity: 0.5;
85
+ cursor: not-allowed;
86
+ }
87
+
88
+ /* Cancel button */
89
+ .taskon-confirm-notice-button--cancel {
90
+ color: rgba(255, 255, 255, 0.9);
91
+ background: rgba(255, 255, 255, 0.1);
92
+ border-color: rgba(255, 255, 255, 0.16);
93
+ }
94
+
95
+ .taskon-confirm-notice-button--cancel:hover:not(:disabled),
96
+ .taskon-confirm-notice-button--cancel:focus-visible:not(:disabled) {
97
+ background: rgba(255, 255, 255, 0.16);
98
+ }
99
+
100
+ /* Confirm button */
101
+ .taskon-confirm-notice-button--confirm {
102
+ color: #000000;
103
+ background: var(--taskon-color-primary, #cbff01);
104
+ }
105
+
106
+ .taskon-confirm-notice-button--confirm:hover:not(:disabled),
107
+ .taskon-confirm-notice-button--confirm:focus-visible:not(:disabled) {
108
+ filter: brightness(0.95);
109
+ }
110
+
111
+ /* Mobile adaptation (aligned with original vw-based behavior) */
112
+ @media (max-width: 750px) {
113
+ .taskon-confirm-notice {
114
+ max-width: none;
115
+ width: auto;
116
+ padding: 8vw 6.667vw 6.667vw;
117
+ }
118
+
119
+ .taskon-confirm-notice-icon {
120
+ width: 7.467vw;
121
+ height: 7.467vw;
122
+ }
123
+
124
+ .taskon-confirm-notice-title {
125
+ margin-top: 4vw;
126
+ font-size: 4.533vw;
127
+ line-height: 5.733vw;
128
+ }
129
+
130
+ .taskon-confirm-notice-desc {
131
+ margin-top: 2vw;
132
+ font-size: 3.733vw;
133
+ line-height: 4.667vw;
134
+ }
135
+
136
+ .taskon-confirm-notice-buttons {
137
+ margin-top: 5.333vw;
138
+ flex-direction: column;
139
+ gap: 2.667vw;
140
+ }
141
+
142
+ .taskon-confirm-notice-button {
143
+ width: 100%;
144
+ min-width: 100%;
145
+ height: 9.333vw;
146
+ line-height: 9.333vw;
147
+ border-radius: 2.133vw;
148
+ font-size: 3.467vw;
149
+ }
150
+ }
1
151
  /**
2
152
  * Textarea 通用组件样式
3
153
  * @description 复刻 Vue 版本 BaseTextareaPro.vue 样式
@@ -17,9 +167,9 @@
17
167
  padding: 12px;
18
168
  padding-bottom: 36px; /* 给计数器留空间 */
19
169
  border-radius: 6px;
20
- border: 1px solid rgba(255, 255, 255, 0.1);
21
- background: rgba(255, 255, 255, 0.04);
22
- color: var(--taskon-color-text, #fff);
170
+ border: 1px solid var(--taskon-color-border);
171
+ background: var(--taskon-color-bg-surface-subtle);
172
+ color: var(--taskon-color-text);
23
173
  font-size: 14px;
24
174
  line-height: 1.5;
25
175
  resize: none;
@@ -28,7 +178,7 @@
28
178
  }
29
179
 
30
180
  .taskon-textarea:focus {
31
- border-color: var(--taskon-color-primary, #cbff01);
181
+ border-color: var(--taskon-color-primary);
32
182
  }
33
183
 
34
184
  .taskon-textarea:disabled {
@@ -37,11 +187,11 @@
37
187
  }
38
188
 
39
189
  .taskon-textarea--error {
40
- border-color: #eb5757;
190
+ border-color: var(--taskon-color-error);
41
191
  }
42
192
 
43
193
  .taskon-textarea::placeholder {
44
- color: var(--taskon-color-text-tertiary, #666);
194
+ color: var(--taskon-color-text-tertiary);
45
195
  }
46
196
 
47
197
  /* ==================== 字数统计 ==================== */
@@ -52,11 +202,11 @@
52
202
  font-weight: 400;
53
203
  font-size: 14px;
54
204
  line-height: 20px;
55
- color: rgba(255, 255, 255, 0.6);
205
+ color: var(--taskon-color-text-tertiary);
56
206
  }
57
207
 
58
208
  .taskon-textarea-count-current {
59
- color: #fff;
209
+ color: var(--taskon-color-text);
60
210
  }
61
211
 
62
212
  /* ==================== 响应式 ==================== */
@@ -83,7 +233,7 @@
83
233
  /* 可点击链接 - 统一蓝色加下划线样式 */
84
234
  .taskon-title-express-link {
85
235
  display: inline;
86
- color: #54aeff;
236
+ color: var(--taskon-color-link);
87
237
  cursor: pointer;
88
238
  text-decoration: underline;
89
239
  transition: opacity 0.2s ease;
@@ -96,7 +246,7 @@
96
246
  /* 可复制文本 */
97
247
  .taskon-title-express-copy {
98
248
  display: inline;
99
- color: var(--taskon-color-secondary, #cbff01);
249
+ color: var(--taskon-color-secondary);
100
250
  cursor: pointer;
101
251
  }
102
252
 
@@ -107,65 +257,573 @@
107
257
  justify-content: center;
108
258
  gap: 6px;
109
259
  padding: 8px 12px;
110
- background: var(--taskon-color-bg-popover, #2a2a2a);
111
- border-radius: 8px;
260
+ background: var(--taskon-color-bg-floating);
261
+ border-radius: var(--taskon-border-radius-sm);
112
262
  border: none;
113
263
  outline: none;
114
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
264
+ box-shadow: 0 4px 12px var(--taskon-color-bg-mask);
115
265
  cursor: pointer;
116
266
  font-size: 14px;
117
267
  font-weight: 500;
118
268
  line-height: 18px;
119
- color: var(--taskon-color-text, #fff);
269
+ color: var(--taskon-color-text);
120
270
  z-index: 9999;
121
271
  animation: taskon-popover-fade-in 0.15s ease;
122
272
  }
123
273
 
124
- .taskon-title-express-popover-content:focus {
125
- outline: none;
274
+ .taskon-title-express-popover-content:focus {
275
+ outline: none;
276
+ }
277
+
278
+ .taskon-title-express-popover-content:hover {
279
+ background: var(--taskon-color-bg-surface);
280
+ }
281
+
282
+ /* 复制图标 */
283
+ .taskon-title-express-copy-icon {
284
+ width: 14px;
285
+ height: 14px;
286
+ flex-shrink: 0;
287
+ }
288
+
289
+ /* Radix Popover 箭头 */
290
+ .taskon-title-express-popover-arrow {
291
+ fill: var(--taskon-color-bg-floating);
292
+ }
293
+
294
+ /* 动画 */
295
+ @keyframes taskon-popover-fade-in {
296
+ from {
297
+ opacity: 0;
298
+ transform: translateY(2px);
299
+ }
300
+ to {
301
+ opacity: 1;
302
+ transform: translateY(0);
303
+ }
304
+ }
305
+
306
+ /* 响应式样式(移动端) */
307
+ @media (max-width: 750px) {
308
+ .taskon-title-express-popover-content {
309
+ padding: 2.13vw 3.2vw;
310
+ font-size: 3.73vw;
311
+ line-height: 4.8vw;
312
+ border-radius: 2.13vw;
313
+ gap: 1.6vw;
314
+ }
315
+
316
+ .taskon-title-express-copy-icon {
317
+ width: 3.73vw;
318
+ height: 3.73vw;
319
+ }
320
+ }
321
+ /**
322
+ * CardDescExpress 组件样式
323
+ * @module components/CardDescExpress
324
+ *
325
+ * @description
326
+ * 对齐原版 TextPreview + Quill 富文本渲染思路:
327
+ * - 容器层控制截断与基础排版
328
+ * - 内容层按 Quill 语义处理列表/缩进/对齐
329
+ */
330
+
331
+ .taskon-card-desc-rich {
332
+ max-height: 60px;
333
+ overflow: hidden;
334
+ font-size: 14px;
335
+ line-height: 21px;
336
+ color: var(--taskon-color-text-tertiary);
337
+ white-space: pre-wrap;
338
+ overflow-wrap: break-word;
339
+ word-break: break-word;
340
+ }
341
+
342
+ .taskon-card-desc-rich--no-max-height {
343
+ margin-top: 0;
344
+ max-height: none;
345
+ overflow: visible;
346
+ }
347
+
348
+ /* ========== 基础防护(降低宿主 reset 影响) ========== */
349
+ .taskon-card-desc-rich,
350
+ .taskon-card-desc-rich *,
351
+ .taskon-card-desc-rich *::before,
352
+ .taskon-card-desc-rich *::after {
353
+ box-sizing: border-box;
354
+ }
355
+
356
+ /* ========== 基础块元素(对齐 Quill 编辑器语义) ========== */
357
+ .taskon-card-desc-rich p,
358
+ .taskon-card-desc-rich ol,
359
+ .taskon-card-desc-rich ul,
360
+ .taskon-card-desc-rich pre,
361
+ .taskon-card-desc-rich blockquote,
362
+ .taskon-card-desc-rich h1,
363
+ .taskon-card-desc-rich h2,
364
+ .taskon-card-desc-rich h3,
365
+ .taskon-card-desc-rich h4,
366
+ .taskon-card-desc-rich h5,
367
+ .taskon-card-desc-rich h6 {
368
+ display: block;
369
+ margin: 0;
370
+ padding: 0;
371
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
372
+ }
373
+
374
+ .taskon-card-desc-rich h1 {
375
+ font-size: 2rem;
376
+ line-height: 33px;
377
+ font-weight: 700;
378
+ color: var(--taskon-color-text);
379
+ }
380
+
381
+ @media (max-width: 750px) {
382
+ .taskon-card-desc-rich h1 {
383
+ font-size: 4.8vw;
384
+ line-height: 6vw;
385
+ font-weight: 600;
386
+ }
387
+ }
388
+
389
+ .taskon-card-desc-rich h2 {
390
+ font-size: 1.5em;
391
+ }
392
+
393
+ .taskon-card-desc-rich h3 {
394
+ font-size: 1.17em;
395
+ }
396
+
397
+ .taskon-card-desc-rich h4 {
398
+ font-size: 1em;
399
+ }
400
+
401
+ .taskon-card-desc-rich h5 {
402
+ font-size: 0.83em;
403
+ }
404
+
405
+ .taskon-card-desc-rich h6 {
406
+ font-size: 0.67em;
407
+ }
408
+
409
+ /* ========== 列表(核心:确保圆点/编号稳定可见) ========== */
410
+ .taskon-card-desc-rich ol,
411
+ .taskon-card-desc-rich ul {
412
+ margin: 0.5em 0;
413
+ padding-left: 1.5em;
414
+ }
415
+
416
+ .taskon-card-desc-rich ol > li,
417
+ .taskon-card-desc-rich ul > li {
418
+ list-style-type: none;
419
+ }
420
+
421
+ .taskon-card-desc-rich li {
422
+ display: list-item;
423
+ }
424
+
425
+ .taskon-card-desc-rich ul > li::before {
426
+ content: "\2022";
427
+ }
428
+
429
+ .taskon-card-desc-rich ul[data-checked="true"],
430
+ .taskon-card-desc-rich ul[data-checked="false"] {
431
+ pointer-events: none;
432
+ }
433
+
434
+ .taskon-card-desc-rich ul[data-checked="true"] > li *,
435
+ .taskon-card-desc-rich ul[data-checked="false"] > li * {
436
+ pointer-events: all;
437
+ }
438
+
439
+ .taskon-card-desc-rich ul[data-checked="true"] > li::before,
440
+ .taskon-card-desc-rich ul[data-checked="false"] > li::before {
441
+ cursor: pointer;
442
+ pointer-events: all;
443
+ }
444
+
445
+ .taskon-card-desc-rich ul[data-checked="true"] > li::before {
446
+ content: "\2611";
447
+ }
448
+
449
+ .taskon-card-desc-rich ul[data-checked="false"] > li::before {
450
+ content: "\2610";
451
+ }
452
+
453
+ .taskon-card-desc-rich li::before {
454
+ display: inline-block;
455
+ width: 1.2em;
456
+ white-space: nowrap;
457
+ }
458
+
459
+ .taskon-card-desc-rich li:not(.ql-direction-rtl)::before {
460
+ margin-right: 0.3em;
461
+ margin-left: -1.5em;
462
+ text-align: right;
463
+ }
464
+
465
+ .taskon-card-desc-rich li.ql-direction-rtl::before {
466
+ margin-right: -1.5em;
467
+ margin-left: 0.3em;
468
+ }
469
+
470
+ .taskon-card-desc-rich ol li:not(.ql-direction-rtl),
471
+ .taskon-card-desc-rich ul li:not(.ql-direction-rtl) {
472
+ padding-left: 1.5em;
473
+ }
474
+
475
+ .taskon-card-desc-rich ol li.ql-direction-rtl,
476
+ .taskon-card-desc-rich ul li.ql-direction-rtl {
477
+ padding-right: 1.5em;
478
+ }
479
+
480
+ .taskon-card-desc-rich ol li {
481
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
482
+ counter-increment: list-0;
483
+ }
484
+
485
+ .taskon-card-desc-rich ol li::before {
486
+ content: counter(list-0, decimal) ". ";
487
+ }
488
+
489
+ .taskon-card-desc-rich ol li.ql-indent-1 {
490
+ counter-increment: list-1;
491
+ counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
492
+ }
493
+
494
+ .taskon-card-desc-rich ol li.ql-indent-1::before {
495
+ content: counter(list-1, lower-alpha) ". ";
496
+ }
497
+
498
+ .taskon-card-desc-rich ol li.ql-indent-2 {
499
+ counter-increment: list-2;
500
+ counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9;
501
+ }
502
+
503
+ .taskon-card-desc-rich ol li.ql-indent-2::before {
504
+ content: counter(list-2, lower-roman) ". ";
505
+ }
506
+
507
+ .taskon-card-desc-rich ol li.ql-indent-3 {
508
+ counter-increment: list-3;
509
+ counter-reset: list-4 list-5 list-6 list-7 list-8 list-9;
510
+ }
511
+
512
+ .taskon-card-desc-rich ol li.ql-indent-3::before {
513
+ content: counter(list-3, decimal) ". ";
514
+ }
515
+
516
+ .taskon-card-desc-rich ol li.ql-indent-4 {
517
+ counter-increment: list-4;
518
+ counter-reset: list-5 list-6 list-7 list-8 list-9;
519
+ }
520
+
521
+ .taskon-card-desc-rich ol li.ql-indent-4::before {
522
+ content: counter(list-4, lower-alpha) ". ";
523
+ }
524
+
525
+ .taskon-card-desc-rich ol li.ql-indent-5 {
526
+ counter-increment: list-5;
527
+ counter-reset: list-6 list-7 list-8 list-9;
528
+ }
529
+
530
+ .taskon-card-desc-rich ol li.ql-indent-5::before {
531
+ content: counter(list-5, lower-roman) ". ";
532
+ }
533
+
534
+ .taskon-card-desc-rich ol li.ql-indent-6 {
535
+ counter-increment: list-6;
536
+ counter-reset: list-7 list-8 list-9;
537
+ }
538
+
539
+ .taskon-card-desc-rich ol li.ql-indent-6::before {
540
+ content: counter(list-6, decimal) ". ";
541
+ }
542
+
543
+ .taskon-card-desc-rich ol li.ql-indent-7 {
544
+ counter-increment: list-7;
545
+ counter-reset: list-8 list-9;
546
+ }
547
+
548
+ .taskon-card-desc-rich ol li.ql-indent-7::before {
549
+ content: counter(list-7, lower-alpha) ". ";
550
+ }
551
+
552
+ .taskon-card-desc-rich ol li.ql-indent-8 {
553
+ counter-increment: list-8;
554
+ counter-reset: list-9;
555
+ }
556
+
557
+ .taskon-card-desc-rich ol li.ql-indent-8::before {
558
+ content: counter(list-8, lower-roman) ". ";
559
+ }
560
+
561
+ .taskon-card-desc-rich ol li.ql-indent-9 {
562
+ counter-increment: list-9;
563
+ }
564
+
565
+ .taskon-card-desc-rich ol li.ql-indent-9::before {
566
+ content: counter(list-9, decimal) ". ";
567
+ }
568
+
569
+ /* ========== 缩进与对齐(对齐 Quill class 语义) ========== */
570
+ .taskon-card-desc-rich .ql-indent-1:not(.ql-direction-rtl) {
571
+ padding-left: 3em;
572
+ }
573
+
574
+ .taskon-card-desc-rich li.ql-indent-1:not(.ql-direction-rtl) {
575
+ padding-left: 4.5em;
576
+ }
577
+
578
+ .taskon-card-desc-rich .ql-indent-1.ql-direction-rtl.ql-align-right {
579
+ padding-right: 3em;
580
+ }
581
+
582
+ .taskon-card-desc-rich li.ql-indent-1.ql-direction-rtl.ql-align-right {
583
+ padding-right: 4.5em;
584
+ }
585
+
586
+ .taskon-card-desc-rich .ql-indent-2:not(.ql-direction-rtl) {
587
+ padding-left: 6em;
588
+ }
589
+
590
+ .taskon-card-desc-rich li.ql-indent-2:not(.ql-direction-rtl) {
591
+ padding-left: 7.5em;
592
+ }
593
+
594
+ .taskon-card-desc-rich .ql-indent-2.ql-direction-rtl.ql-align-right {
595
+ padding-right: 6em;
596
+ }
597
+
598
+ .taskon-card-desc-rich li.ql-indent-2.ql-direction-rtl.ql-align-right {
599
+ padding-right: 7.5em;
600
+ }
601
+
602
+ .taskon-card-desc-rich .ql-indent-3:not(.ql-direction-rtl) {
603
+ padding-left: 9em;
604
+ }
605
+
606
+ .taskon-card-desc-rich li.ql-indent-3:not(.ql-direction-rtl) {
607
+ padding-left: 10.5em;
608
+ }
609
+
610
+ .taskon-card-desc-rich .ql-indent-3.ql-direction-rtl.ql-align-right {
611
+ padding-right: 9em;
612
+ }
613
+
614
+ .taskon-card-desc-rich li.ql-indent-3.ql-direction-rtl.ql-align-right {
615
+ padding-right: 10.5em;
616
+ }
617
+
618
+ .taskon-card-desc-rich .ql-indent-4:not(.ql-direction-rtl) {
619
+ padding-left: 12em;
620
+ }
621
+
622
+ .taskon-card-desc-rich li.ql-indent-4:not(.ql-direction-rtl) {
623
+ padding-left: 13.5em;
624
+ }
625
+
626
+ .taskon-card-desc-rich .ql-indent-4.ql-direction-rtl.ql-align-right {
627
+ padding-right: 12em;
628
+ }
629
+
630
+ .taskon-card-desc-rich li.ql-indent-4.ql-direction-rtl.ql-align-right {
631
+ padding-right: 13.5em;
632
+ }
633
+
634
+ .taskon-card-desc-rich .ql-indent-5:not(.ql-direction-rtl) {
635
+ padding-left: 15em;
636
+ }
637
+
638
+ .taskon-card-desc-rich li.ql-indent-5:not(.ql-direction-rtl) {
639
+ padding-left: 16.5em;
640
+ }
641
+
642
+ .taskon-card-desc-rich .ql-indent-5.ql-direction-rtl.ql-align-right {
643
+ padding-right: 15em;
644
+ }
645
+
646
+ .taskon-card-desc-rich li.ql-indent-5.ql-direction-rtl.ql-align-right {
647
+ padding-right: 16.5em;
648
+ }
649
+
650
+ .taskon-card-desc-rich .ql-indent-6:not(.ql-direction-rtl) {
651
+ padding-left: 18em;
652
+ }
653
+
654
+ .taskon-card-desc-rich li.ql-indent-6:not(.ql-direction-rtl) {
655
+ padding-left: 19.5em;
656
+ }
657
+
658
+ .taskon-card-desc-rich .ql-indent-6.ql-direction-rtl.ql-align-right {
659
+ padding-right: 18em;
660
+ }
661
+
662
+ .taskon-card-desc-rich li.ql-indent-6.ql-direction-rtl.ql-align-right {
663
+ padding-right: 19.5em;
664
+ }
665
+
666
+ .taskon-card-desc-rich .ql-indent-7:not(.ql-direction-rtl) {
667
+ padding-left: 21em;
668
+ }
669
+
670
+ .taskon-card-desc-rich li.ql-indent-7:not(.ql-direction-rtl) {
671
+ padding-left: 22.5em;
672
+ }
673
+
674
+ .taskon-card-desc-rich .ql-indent-7.ql-direction-rtl.ql-align-right {
675
+ padding-right: 21em;
676
+ }
677
+
678
+ .taskon-card-desc-rich li.ql-indent-7.ql-direction-rtl.ql-align-right {
679
+ padding-right: 22.5em;
680
+ }
681
+
682
+ .taskon-card-desc-rich .ql-indent-8:not(.ql-direction-rtl) {
683
+ padding-left: 24em;
684
+ }
685
+
686
+ .taskon-card-desc-rich li.ql-indent-8:not(.ql-direction-rtl) {
687
+ padding-left: 25.5em;
688
+ }
689
+
690
+ .taskon-card-desc-rich .ql-indent-8.ql-direction-rtl.ql-align-right {
691
+ padding-right: 24em;
692
+ }
693
+
694
+ .taskon-card-desc-rich li.ql-indent-8.ql-direction-rtl.ql-align-right {
695
+ padding-right: 25.5em;
696
+ }
697
+
698
+ .taskon-card-desc-rich .ql-indent-9:not(.ql-direction-rtl) {
699
+ padding-left: 27em;
700
+ }
701
+
702
+ .taskon-card-desc-rich li.ql-indent-9:not(.ql-direction-rtl) {
703
+ padding-left: 28.5em;
704
+ }
705
+
706
+ .taskon-card-desc-rich .ql-indent-9.ql-direction-rtl.ql-align-right {
707
+ padding-right: 27em;
708
+ }
709
+
710
+ .taskon-card-desc-rich li.ql-indent-9.ql-direction-rtl.ql-align-right {
711
+ padding-right: 28.5em;
712
+ }
713
+
714
+ .taskon-card-desc-rich .ql-direction-rtl {
715
+ direction: rtl;
716
+ text-align: inherit;
717
+ }
718
+
719
+ .taskon-card-desc-rich .ql-align-center {
720
+ text-align: center;
721
+ }
722
+
723
+ .taskon-card-desc-rich .ql-align-right {
724
+ text-align: right;
725
+ }
726
+
727
+ .taskon-card-desc-rich .ql-align-justify {
728
+ text-align: justify;
729
+ }
730
+
731
+ /* ========== 常见富文本元素 ========== */
732
+ .taskon-card-desc-rich a {
733
+ color: var(--taskon-color-link);
734
+ text-decoration: underline;
735
+ }
736
+
737
+ .taskon-card-desc-rich a:hover {
738
+ opacity: 0.8;
739
+ }
740
+
741
+ .taskon-card-desc-rich strong,
742
+ .taskon-card-desc-rich b {
743
+ font-weight: 600;
744
+ color: var(--taskon-color-text);
126
745
  }
127
746
 
128
- .taskon-title-express-popover-content:hover {
129
- background: var(--taskon-color-bg-popover-hover, #3a3a3a);
747
+ .taskon-card-desc-rich em,
748
+ .taskon-card-desc-rich i {
749
+ font-style: italic;
130
750
  }
131
751
 
132
- /* 复制图标 */
133
- .taskon-title-express-copy-icon {
134
- width: 14px;
135
- height: 14px;
136
- flex-shrink: 0;
752
+ .taskon-card-desc-rich u,
753
+ .taskon-card-desc-rich ins {
754
+ text-decoration: underline;
137
755
  }
138
756
 
139
- /* Radix Popover 箭头 */
140
- .taskon-title-express-popover-arrow {
141
- fill: var(--taskon-color-bg-popover, #2a2a2a);
757
+ .taskon-card-desc-rich code {
758
+ padding: 0.2em 0.4em;
759
+ font-size: 0.9em;
760
+ background: var(--taskon-color-bg-surface-strong);
761
+ border-radius: 3px;
142
762
  }
143
763
 
144
- /* 动画 */
145
- @keyframes taskon-popover-fade-in {
146
- from {
147
- opacity: 0;
148
- transform: translateY(2px);
764
+ .taskon-card-desc-rich pre {
765
+ margin: 0.5em 0;
766
+ padding: 0.75em 1em;
767
+ overflow-x: auto;
768
+ text-wrap: initial;
769
+ background: var(--taskon-color-bg-surface-subtle);
770
+ border-radius: 6px;
771
+ }
772
+
773
+ .taskon-card-desc-rich blockquote {
774
+ margin: 0.5em 0;
775
+ padding-left: 1em;
776
+ color: var(--taskon-color-text-tertiary);
777
+ border-left: 3px solid var(--taskon-color-link);
778
+ }
779
+
780
+ .taskon-card-desc-rich img {
781
+ max-width: 100%;
782
+ height: auto;
783
+ border-radius: 6px;
784
+ }
785
+
786
+ .taskon-card-desc-rich iframe {
787
+ display: block;
788
+ width: 100%;
789
+ max-width: 100%;
790
+ }
791
+
792
+ /* ========== 响应式样式(移动端) ========== */
793
+ @media (max-width: 750px) {
794
+ .taskon-card-desc-rich {
795
+ max-height: 18vw;
796
+ font-size: 3.733vw;
797
+ line-height: normal;
149
798
  }
150
- to {
151
- opacity: 1;
152
- transform: translateY(0);
799
+
800
+ .taskon-card-desc-rich--no-max-height {
801
+ margin-top: 0;
802
+ max-height: none;
153
803
  }
154
804
  }
805
+ /**
806
+ * TaskVerifyFailedDialog styles
807
+ * @description Match Vue ErrorInfo content rhythm and readability.
808
+ */
809
+
810
+ .taskon-task-verify-failed-dialog .taskon-dialog-body {
811
+ padding: 0;
812
+ }
813
+
814
+ .taskon-task-verify-failed-dialog-message {
815
+ margin-top: 10px;
816
+ font-size: 16px;
817
+ line-height: 20px;
818
+ color: var(--taskon-color-text-tertiary);
819
+ white-space: pre-wrap;
820
+ }
155
821
 
156
- /* 响应式样式(移动端) */
157
822
  @media (max-width: 750px) {
158
- .taskon-title-express-popover-content {
159
- padding: 2.13vw 3.2vw;
823
+ .taskon-task-verify-failed-dialog-message {
824
+ margin-top: 3.73vw;
160
825
  font-size: 3.73vw;
161
- line-height: 4.8vw;
162
- border-radius: 2.13vw;
163
- gap: 1.6vw;
164
- }
165
-
166
- .taskon-title-express-copy-icon {
167
- width: 3.73vw;
168
- height: 3.73vw;
826
+ line-height: 4.67vw;
169
827
  }
170
828
  }
171
829
  /**
@@ -181,30 +839,11 @@
181
839
  /* 继承 TaskCardBase 的样式 */
182
840
  }
183
841
 
184
- /* ============================================
185
- * POW Description
186
- * ============================================ */
187
- .taskon-pow-desc {
188
- font-size: 14px;
189
- line-height: 21px;
190
- color: rgba(255, 255, 255, 0.8);
191
- word-break: break-word;
192
- }
193
-
194
- .taskon-pow-desc a {
195
- color: var(--taskon-primary-color, #3b82f6);
196
- text-decoration: none;
197
- }
198
-
199
- .taskon-pow-desc a:hover {
200
- text-decoration: underline;
201
- }
202
-
203
842
  /* ============================================
204
843
  * POW Input Area
205
844
  * ============================================ */
206
845
  .taskon-pow-input-area {
207
- margin-top: 15px;
846
+ margin-top: var(--taskon-spacing-md);
208
847
  }
209
848
 
210
849
  /* ============================================
@@ -213,23 +852,24 @@
213
852
  .taskon-pow-url-row {
214
853
  display: flex;
215
854
  align-items: center;
216
- gap: 15px;
855
+ gap: var(--taskon-spacing-md);
217
856
  }
218
857
 
219
858
  .taskon-pow-input {
220
859
  flex: 1;
221
- padding: 10px 12px;
222
- border: 1px solid rgba(255, 255, 255, 0.2);
223
- border-radius: 6px;
224
- background: rgba(255, 255, 255, 0.05);
225
- color: #fff;
860
+ padding: var(--taskon-spacing-sm)
861
+ var(--taskon-spacing-md);
862
+ border: 1px solid var(--taskon-color-border);
863
+ border-radius: var(--taskon-border-radius);
864
+ background: var(--taskon-color-bg-surface-subtle);
865
+ color: var(--taskon-color-text);
226
866
  font-size: 14px;
227
867
  outline: none;
228
868
  transition: border-color 0.2s ease;
229
869
  }
230
870
 
231
871
  .taskon-pow-input:focus {
232
- border-color: var(--taskon-primary-color, #3b82f6);
872
+ border-color: var(--taskon-color-primary);
233
873
  }
234
874
 
235
875
  .taskon-pow-input:disabled {
@@ -238,7 +878,7 @@
238
878
  }
239
879
 
240
880
  .taskon-pow-input::placeholder {
241
- color: rgba(255, 255, 255, 0.4);
881
+ color: var(--taskon-color-text-disabled);
242
882
  }
243
883
 
244
884
  /* ============================================
@@ -247,7 +887,7 @@
247
887
  .taskon-pow-text-row {
248
888
  display: flex;
249
889
  align-items: flex-end;
250
- gap: 15px;
890
+ gap: var(--taskon-spacing-md);
251
891
  }
252
892
 
253
893
  .taskon-pow-text-row .taskon-textarea-wrap {
@@ -258,7 +898,7 @@
258
898
  * Image Upload Area - 与 Vue 版本 PowImageUploader 一致
259
899
  * ============================================ */
260
900
  .taskon-pow-image-uploader {
261
- margin-top: 20px;
901
+ margin-top: var(--taskon-spacing-lg);
262
902
  display: flex;
263
903
  align-items: center;
264
904
  }
@@ -274,20 +914,20 @@
274
914
  text-align: center;
275
915
  font-size: 0;
276
916
  overflow: hidden;
277
- border: 1px solid rgba(255, 255, 255, 0.2);
278
- border-radius: 8px;
279
- background: rgba(255, 255, 255, 0.05);
917
+ border: 1px solid var(--taskon-color-border);
918
+ border-radius: var(--taskon-border-radius);
919
+ background: var(--taskon-color-bg-surface-subtle);
280
920
  cursor: pointer;
281
921
  transition: border-color 0.2s ease;
282
922
  }
283
923
 
284
924
  .taskon-pow-image-upload-area:hover:not(.taskon-pow-image-upload-area--disabled) {
285
- border-color: var(--taskon-primary-color, #3b82f6);
925
+ border-color: var(--taskon-color-primary);
286
926
  }
287
927
 
288
928
  .taskon-pow-image-upload-area:focus {
289
929
  outline: none;
290
- border-color: var(--taskon-primary-color, #3b82f6);
930
+ border-color: var(--taskon-color-primary);
291
931
  }
292
932
 
293
933
  .taskon-pow-image-upload-area--disabled {
@@ -298,7 +938,7 @@
298
938
  .taskon-pow-image-upload-icon {
299
939
  width: 18px;
300
940
  height: 18px;
301
- color: rgba(255, 255, 255, 0.6);
941
+ color: var(--taskon-color-text-tertiary);
302
942
  }
303
943
 
304
944
  .taskon-pow-image-upload-tip {
@@ -308,12 +948,12 @@
308
948
  letter-spacing: 0.04em;
309
949
  text-transform: uppercase;
310
950
  white-space: pre-wrap;
311
- color: rgba(255, 255, 255, 0.6);
951
+ color: var(--taskon-color-text-tertiary);
312
952
  }
313
953
 
314
954
  .taskon-pow-image-preview {
315
- border-radius: 4px;
316
- margin: 20px 0;
955
+ border-radius: var(--taskon-border-radius-sm);
956
+ margin: var(--taskon-spacing-lg) 0;
317
957
  max-width: 100%;
318
958
  max-height: 300px;
319
959
  }
@@ -327,7 +967,7 @@
327
967
  align-items: center;
328
968
  justify-content: center;
329
969
  flex-direction: column;
330
- background: rgba(0, 0, 0, 0.8);
970
+ background: var(--taskon-color-bg-mask);
331
971
  }
332
972
 
333
973
  .taskon-pow-image-upload-area:hover .taskon-pow-image-mask,
@@ -336,11 +976,11 @@
336
976
  }
337
977
 
338
978
  .taskon-pow-image-mask .taskon-pow-image-upload-icon {
339
- color: #fff;
979
+ color: var(--taskon-color-secondary);
340
980
  }
341
981
 
342
982
  .taskon-pow-image-mask .taskon-pow-image-upload-tip {
343
- color: #fff;
983
+ color: var(--taskon-color-secondary);
344
984
  opacity: 1;
345
985
  }
346
986
 
@@ -351,14 +991,14 @@
351
991
  right: 0;
352
992
  bottom: 0;
353
993
  left: 0;
354
- background: rgba(255, 255, 255, 0.1);
994
+ background: var(--taskon-color-bg-surface-strong);
355
995
  height: 6px;
356
996
  }
357
997
 
358
998
  .taskon-pow-image-progress-fill {
359
- background: var(--taskon-primary-color, #3b82f6);
999
+ background: var(--taskon-color-primary);
360
1000
  height: 100%;
361
- border-radius: 4px;
1001
+ border-radius: var(--taskon-border-radius-sm);
362
1002
  transition: width 0.2s ease;
363
1003
  }
364
1004
 
@@ -368,7 +1008,7 @@
368
1008
  .taskon-pow-error {
369
1009
  margin-top: 10px;
370
1010
  font-size: 14px;
371
- color: #ef4444;
1011
+ color: var(--taskon-color-error);
372
1012
  }
373
1013
 
374
1014
  /* ============================================
@@ -377,7 +1017,7 @@
377
1017
  /* 与 Vue 版本 AverageReview.vue 样式一致 */
378
1018
  .taskon-pow-review-time {
379
1019
  margin-top: 10px;
380
- color: rgba(255, 212, 101, 0.6);
1020
+ color: var(--taskon-color-warning);
381
1021
  font-size: 13px;
382
1022
  font-weight: 500;
383
1023
  line-height: 16px;
@@ -425,29 +1065,6 @@
425
1065
  max-height: 32vw;
426
1066
  }
427
1067
  }
428
- /**
429
- * ContractInteractiveTask Styles
430
- */
431
-
432
- .taskon-contract-task {
433
- /* 继承 TaskCardBase 样式 */
434
- }
435
-
436
- .taskon-contract-desc {
437
- font-size: 14px;
438
- line-height: 21px;
439
- color: rgba(255, 255, 255, 0.8);
440
- word-break: break-word;
441
- }
442
-
443
- .taskon-contract-desc a {
444
- color: var(--taskon-primary-color, #3b82f6);
445
- text-decoration: none;
446
- }
447
-
448
- .taskon-contract-desc a:hover {
449
- text-decoration: underline;
450
- }
451
1068
  /* ============================================
452
1069
  DynamicPoints Component Styles
453
1070
  与 Vue 版本 BaseDynamicPoint.vue 样式一致
@@ -456,33 +1073,33 @@
456
1073
  .taskon-dynamic-points {
457
1074
  display: inline-flex;
458
1075
  align-items: center;
459
- gap: 8px;
460
- padding: 8px 12px;
461
- background: rgba(255, 255, 255, 0.04);
462
- border-radius: 8px;
1076
+ gap: var(--taskon-spacing-sm);
1077
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
1078
+ background: var(--taskon-color-bg-surface-subtle);
1079
+ border-radius: var(--taskon-border-radius);
463
1080
  }
464
1081
 
465
1082
  .taskon-dynamic-points-value-wrap {
466
1083
  display: flex;
467
1084
  align-items: center;
468
- gap: 8px;
1085
+ gap: var(--taskon-spacing-sm);
469
1086
  flex-shrink: 0;
470
1087
  }
471
1088
 
472
1089
  .taskon-dynamic-points-value {
473
1090
  font-size: 16px;
474
1091
  font-weight: 600;
475
- color: var(--taskon-task-text-primary, #fff);
1092
+ color: var(--taskon-color-text);
476
1093
  }
477
1094
 
478
1095
  .taskon-dynamic-points-value--highlight {
479
- color: #00ffa3 !important;
1096
+ color: var(--taskon-color-secondary);
480
1097
  }
481
1098
 
482
1099
  .taskon-dynamic-points-max {
483
1100
  font-size: 14px;
484
1101
  font-weight: 500;
485
- color: var(--taskon-task-text-secondary, rgba(255, 255, 255, 0.6));
1102
+ color: var(--taskon-color-text-tertiary);
486
1103
  text-transform: capitalize;
487
1104
  }
488
1105
 
@@ -490,12 +1107,12 @@
490
1107
  display: inline-flex;
491
1108
  align-items: center;
492
1109
  justify-content: center;
493
- color: var(--taskon-task-text-secondary, rgba(255, 255, 255, 0.6));
1110
+ color: var(--taskon-color-text-tertiary);
494
1111
  cursor: pointer;
495
1112
  }
496
1113
 
497
1114
  .taskon-dynamic-points-info:hover {
498
- color: var(--taskon-task-text-primary, #fff);
1115
+ color: var(--taskon-color-text);
499
1116
  }
500
1117
 
501
1118
  .taskon-dynamic-points-refresh {
@@ -505,11 +1122,11 @@
505
1122
  width: 24px;
506
1123
  height: 24px;
507
1124
  padding: 0;
508
- margin-left: 4px;
1125
+ margin-left: var(--taskon-spacing-xs);
509
1126
  background: transparent;
510
1127
  border: none;
511
- border-radius: 4px;
512
- color: #54aeff;
1128
+ border-radius: var(--taskon-border-radius-sm);
1129
+ color: var(--taskon-color-link);
513
1130
  cursor: pointer;
514
1131
  transition: opacity 0.2s, transform 0.2s;
515
1132
  }
@@ -524,7 +1141,7 @@
524
1141
  }
525
1142
 
526
1143
  .taskon-dynamic-points-refresh--animating {
527
- filter: drop-shadow(0 0 4px rgba(84, 174, 255, 0.8));
1144
+ filter: drop-shadow(0 0 4px var(--taskon-color-link));
528
1145
  }
529
1146
 
530
1147
  .taskon-dynamic-points-refresh-icon {
@@ -548,8 +1165,7 @@
548
1165
  .taskon-dynamic-points-cooldown {
549
1166
  font-size: 14px;
550
1167
  font-weight: 500;
551
- color: #54aeff !important;
552
- font-family: Menlo, Consolas, "Liberation Mono", "Courier New", Courier, monospace;
1168
+ color: var(--taskon-color-link);
553
1169
  }
554
1170
  /**
555
1171
  * SwapDexTask Styles
@@ -564,78 +1180,66 @@
564
1180
  .taskon-swap-content {
565
1181
  display: flex;
566
1182
  flex-direction: column;
567
- gap: 16px;
1183
+ gap: var(--taskon-spacing-md);
568
1184
  }
569
1185
 
570
1186
  /* Rules section - 动态积分规则区域 */
571
1187
  .taskon-swap-rules-section {
572
1188
  display: flex;
573
1189
  flex-direction: column;
574
- gap: 8px;
1190
+ gap: var(--taskon-spacing-sm);
575
1191
  }
576
1192
 
577
1193
  .taskon-swap-rules-title {
578
1194
  font-size: 14px;
579
1195
  font-weight: 500;
580
- color: rgba(255, 255, 255, 0.6);
581
- margin-bottom: 8px;
1196
+ color: var(--taskon-color-text-tertiary);
1197
+ margin-bottom: var(--taskon-spacing-sm);
582
1198
  }
583
1199
 
584
1200
  .taskon-swap-rules-content {
585
1201
  display: flex;
586
1202
  flex-wrap: wrap;
587
1203
  align-items: center;
588
- gap: 4px;
589
- padding: 12px;
590
- border-radius: 8px;
591
- background: rgba(255, 255, 255, 0.05);
1204
+ gap: var(--taskon-spacing-xs);
1205
+ padding: var(--taskon-spacing-md);
1206
+ border-radius: var(--taskon-border-radius);
1207
+ background: var(--taskon-color-bg-surface-subtle);
592
1208
  font-size: 14px;
593
1209
  font-weight: 500;
594
- color: rgba(255, 255, 255, 0.6);
1210
+ color: var(--taskon-color-text-tertiary);
595
1211
  }
596
1212
 
597
1213
  .taskon-swap-rules-highlight {
598
- color: var(--taskon-secondary-color, #00ffa3);
1214
+ color: var(--taskon-color-secondary);
599
1215
  }
600
1216
 
601
1217
  .taskon-swap-rules-point-name {
602
- color: rgba(255, 255, 255, 0.4);
1218
+ color: var(--taskon-color-text-secondary);
1219
+ }
1220
+
1221
+ .taskon-swap-rules-max {
1222
+ color: var(--taskon-color-text-tertiary);
603
1223
  }
604
1224
 
605
1225
  /* Instructions section - 任务描述区域 */
606
1226
  .taskon-swap-instructions-section {
607
1227
  display: flex;
608
1228
  flex-direction: column;
609
- gap: 8px;
1229
+ gap: var(--taskon-spacing-sm);
610
1230
  }
611
1231
 
612
1232
  .taskon-swap-instructions-title {
613
1233
  font-size: 14px;
614
1234
  font-weight: 500;
615
- color: rgba(255, 255, 255, 0.6);
616
- margin-bottom: 8px;
1235
+ color: var(--taskon-color-text-tertiary);
1236
+ margin-bottom: var(--taskon-spacing-sm);
617
1237
  }
618
1238
 
619
1239
  .taskon-swap-instructions-content {
620
- padding: 12px;
621
- border-radius: 8px;
622
- background: rgba(255, 255, 255, 0.05);
623
- }
624
-
625
- .taskon-swap-desc {
626
- font-size: 14px;
627
- line-height: 21px;
628
- color: rgba(255, 255, 255, 0.8);
629
- word-break: break-word;
630
- }
631
-
632
- .taskon-swap-desc a {
633
- color: var(--taskon-primary-color, #3b82f6);
634
- text-decoration: none;
635
- }
636
-
637
- .taskon-swap-desc a:hover {
638
- text-decoration: underline;
1240
+ padding: var(--taskon-spacing-md);
1241
+ border-radius: var(--taskon-border-radius);
1242
+ background: var(--taskon-color-bg-surface-subtle);
639
1243
  }
640
1244
  /**
641
1245
  * OuterPointAPITask Styles
@@ -646,35 +1250,18 @@
646
1250
  /* 继承 TaskCardBase 样式 */
647
1251
  }
648
1252
 
649
- /* ==================== Description Area ==================== */
650
- .taskon-outer-point-api-desc {
651
- font-size: 14px;
652
- line-height: 21px;
653
- color: rgba(255, 255, 255, 0.8);
654
- word-break: break-word;
655
- }
656
-
657
- .taskon-outer-point-api-desc a {
658
- color: var(--taskon-primary-color, #3b82f6);
659
- text-decoration: none;
660
- }
661
-
662
- .taskon-outer-point-api-desc a:hover {
663
- text-decoration: underline;
664
- }
665
-
666
1253
  /* ==================== Customized Param Dialog ==================== */
667
1254
  .taskon-outer-point-api-dialog {
668
1255
  display: flex;
669
1256
  flex-direction: column;
670
- gap: 16px;
1257
+ gap: var(--taskon-spacing-md);
671
1258
  }
672
1259
 
673
1260
  /* Dialog title */
674
1261
  .taskon-outer-point-api-dialog-title {
675
1262
  font-size: 18px;
676
1263
  font-weight: 600;
677
- color: #fff;
1264
+ color: var(--taskon-color-text);
678
1265
  margin: 0;
679
1266
  }
680
1267
 
@@ -682,11 +1269,11 @@
682
1269
  .taskon-outer-point-api-dialog-warning {
683
1270
  display: flex;
684
1271
  align-items: center;
685
- gap: 8px;
686
- padding: 12px;
687
- border-radius: 8px;
688
- background: rgba(255, 171, 0, 0.1);
689
- color: #ffab00;
1272
+ gap: var(--taskon-spacing-sm);
1273
+ padding: var(--taskon-spacing-md);
1274
+ border-radius: var(--taskon-border-radius);
1275
+ background: var(--taskon-color-warning-bg);
1276
+ color: var(--taskon-color-warning);
690
1277
  font-size: 14px;
691
1278
  line-height: 20px;
692
1279
  }
@@ -701,29 +1288,30 @@
701
1288
  .taskon-outer-point-api-dialog-desc {
702
1289
  font-size: 14px;
703
1290
  line-height: 20px;
704
- color: rgba(255, 255, 255, 0.6);
1291
+ color: var(--taskon-color-text-tertiary);
705
1292
  }
706
1293
 
707
1294
  /* Input area */
708
1295
  .taskon-outer-point-api-dialog-input-wrap {
709
1296
  display: flex;
710
1297
  flex-direction: column;
711
- gap: 8px;
1298
+ gap: var(--taskon-spacing-sm);
712
1299
  }
713
1300
 
714
1301
  .taskon-outer-point-api-dialog-label {
715
1302
  font-size: 14px;
716
1303
  font-weight: 500;
717
- color: rgba(255, 255, 255, 0.8);
1304
+ color: var(--taskon-color-text-secondary);
718
1305
  }
719
1306
 
720
1307
  .taskon-outer-point-api-dialog-input {
721
1308
  width: 100%;
722
- padding: 10px 12px;
723
- border-radius: 8px;
724
- border: 1px solid rgba(255, 255, 255, 0.15);
725
- background: rgba(255, 255, 255, 0.05);
726
- color: #fff;
1309
+ padding: var(--taskon-spacing-sm)
1310
+ var(--taskon-spacing-md);
1311
+ border-radius: var(--taskon-border-radius);
1312
+ border: 1px solid var(--taskon-color-border);
1313
+ background: var(--taskon-color-bg-surface-subtle);
1314
+ color: var(--taskon-color-text);
727
1315
  font-size: 14px;
728
1316
  line-height: 20px;
729
1317
  outline: none;
@@ -732,33 +1320,33 @@
732
1320
  }
733
1321
 
734
1322
  .taskon-outer-point-api-dialog-input::placeholder {
735
- color: rgba(255, 255, 255, 0.3);
1323
+ color: var(--taskon-color-text-disabled);
736
1324
  }
737
1325
 
738
1326
  .taskon-outer-point-api-dialog-input:focus {
739
- border-color: var(--taskon-primary-color, #3b82f6);
1327
+ border-color: var(--taskon-color-primary);
740
1328
  }
741
1329
 
742
1330
  .taskon-outer-point-api-dialog-input--error {
743
- border-color: #ff4d4f;
1331
+ border-color: var(--taskon-color-error);
744
1332
  }
745
1333
 
746
1334
  .taskon-outer-point-api-dialog-error {
747
1335
  font-size: 12px;
748
- color: #ff4d4f;
1336
+ color: var(--taskon-color-error);
749
1337
  }
750
1338
 
751
1339
  /* Action buttons */
752
1340
  .taskon-outer-point-api-dialog-actions {
753
1341
  display: flex;
754
1342
  justify-content: flex-end;
755
- gap: 12px;
756
- margin-top: 8px;
1343
+ gap: var(--taskon-spacing-md);
1344
+ margin-top: var(--taskon-spacing-sm);
757
1345
  }
758
1346
 
759
1347
  .taskon-outer-point-api-dialog-btn {
760
- padding: 8px 24px;
761
- border-radius: 8px;
1348
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-lg);
1349
+ border-radius: var(--taskon-border-radius);
762
1350
  font-size: 14px;
763
1351
  font-weight: 500;
764
1352
  cursor: pointer;
@@ -767,17 +1355,17 @@
767
1355
  }
768
1356
 
769
1357
  .taskon-outer-point-api-dialog-btn--cancel {
770
- background: rgba(255, 255, 255, 0.1);
771
- color: rgba(255, 255, 255, 0.8);
1358
+ background: var(--taskon-color-bg-surface-strong);
1359
+ color: var(--taskon-color-text-secondary);
772
1360
  }
773
1361
 
774
1362
  .taskon-outer-point-api-dialog-btn--cancel:hover {
775
- background: rgba(255, 255, 255, 0.15);
1363
+ background: var(--taskon-color-bg-inset);
776
1364
  }
777
1365
 
778
1366
  .taskon-outer-point-api-dialog-btn--confirm {
779
- background: var(--taskon-primary-color, #3b82f6);
780
- color: #fff;
1367
+ background: var(--taskon-color-primary);
1368
+ color: var(--taskon-color-text-on-primary);
781
1369
  }
782
1370
 
783
1371
  .taskon-outer-point-api-dialog-btn--confirm:hover {
@@ -795,41 +1383,6 @@
795
1383
  * 命名规范:.taskon-task-{component}-{element}--{modifier}
796
1384
  */
797
1385
 
798
- /* ============================================
799
- CSS Variables (可被项目方覆盖)
800
- ============================================ */
801
- :root {
802
- /* Task card colors (dark theme, same as taskon-website) */
803
- --taskon-task-bg: #1d2123;
804
- --taskon-task-border: #1d2123;
805
- --taskon-task-border-hover: #41494b;
806
- --taskon-task-radius: 10px;
807
-
808
- /* Text colors */
809
- --taskon-task-text: #ffffff;
810
- --taskon-task-text-secondary: #9ca3af;
811
- --taskon-task-text-muted: #6b7280;
812
-
813
- /* Status colors */
814
- --taskon-color-primary: #3b82f6;
815
- --taskon-color-success: #22c55e;
816
- --taskon-color-warning: #f59e0b;
817
- --taskon-color-error: #ef4444;
818
-
819
- /* Recurrence badge color */
820
- --taskon-recurrence-color: #9aff73;
821
-
822
- /* Spacing */
823
- --taskon-task-spacing-xs: 4px;
824
- --taskon-task-spacing-sm: 8px;
825
- --taskon-task-spacing-md: 12px;
826
- --taskon-task-spacing-lg: 16px;
827
- --taskon-task-spacing-xl: 24px;
828
-
829
- /* Transitions */
830
- --taskon-task-transition: 0.2s ease;
831
- }
832
-
833
1386
  /* ============================================
834
1387
  TaskList Styles
835
1388
  与 Vue 版本 TaskList.vue + TaskType.vue 一致
@@ -837,12 +1390,12 @@
837
1390
  .taskon-task-list {
838
1391
  display: flex;
839
1392
  flex-direction: column;
840
- gap: var(--taskon-task-spacing-lg);
1393
+ gap: var(--taskon-spacing-md);
841
1394
  }
842
1395
 
843
1396
  /* Progress section */
844
1397
  .taskon-task-list-progress-wrap {
845
- margin-bottom: var(--taskon-task-spacing-sm);
1398
+ margin-bottom: var(--taskon-spacing-sm);
846
1399
  }
847
1400
 
848
1401
  /* Section styles */
@@ -869,17 +1422,17 @@
869
1422
  font-size: 22px;
870
1423
  font-weight: 600;
871
1424
  line-height: 21px;
872
- color: var(--taskon-task-text);
1425
+ color: var(--taskon-color-text);
873
1426
  }
874
1427
 
875
1428
  .taskon-task-list-section-hint {
876
1429
  font-size: 14px;
877
- color: rgba(255, 255, 255, 0.6);
1430
+ color: var(--taskon-color-text-tertiary);
878
1431
  }
879
1432
 
880
1433
  .taskon-task-list-section-hint-em {
881
1434
  font-weight: 600;
882
- color: rgba(0, 255, 163, 1);
1435
+ color: var(--taskon-color-secondary);
883
1436
  }
884
1437
 
885
1438
  .taskon-task-list-items {
@@ -895,9 +1448,9 @@
895
1448
 
896
1449
  /* Empty state */
897
1450
  .taskon-task-list-empty {
898
- padding: var(--taskon-task-spacing-xl);
1451
+ padding: var(--taskon-spacing-lg);
899
1452
  text-align: center;
900
- color: var(--taskon-task-text-muted);
1453
+ color: var(--taskon-color-text-disabled);
901
1454
  }
902
1455
 
903
1456
  /* Mobile responsive */
@@ -945,12 +1498,12 @@
945
1498
  .taskon-task-progress {
946
1499
  display: flex;
947
1500
  flex-direction: column;
948
- gap: var(--taskon-task-spacing-sm);
1501
+ gap: var(--taskon-spacing-sm);
949
1502
  }
950
1503
 
951
1504
  .taskon-task-progress-bar {
952
1505
  height: 6px;
953
- background: rgba(255, 255, 255, 0.1);
1506
+ background: var(--taskon-color-bg-surface-strong);
954
1507
  border-radius: 3px;
955
1508
  overflow: hidden;
956
1509
  }
@@ -959,7 +1512,7 @@
959
1512
  height: 100%;
960
1513
  background: var(--taskon-color-primary);
961
1514
  border-radius: 3px;
962
- transition: width var(--taskon-task-transition);
1515
+ transition: width 0.2s ease;
963
1516
  }
964
1517
 
965
1518
  .taskon-task-progress--completed .taskon-task-progress-bar-fill {
@@ -969,9 +1522,9 @@
969
1522
  .taskon-task-progress-text {
970
1523
  display: flex;
971
1524
  align-items: center;
972
- gap: var(--taskon-task-spacing-xs);
1525
+ gap: var(--taskon-spacing-xs);
973
1526
  font-size: 13px;
974
- color: var(--taskon-task-text-secondary);
1527
+ color: var(--taskon-color-text-tertiary);
975
1528
  }
976
1529
 
977
1530
  .taskon-task-progress--completed .taskon-task-progress-text {
@@ -990,14 +1543,14 @@
990
1543
  .taskon-task-item {
991
1544
  position: relative;
992
1545
  padding: 16px 20px;
993
- background: var(--taskon-task-bg);
994
- border-radius: var(--taskon-task-radius);
995
- border: 1px solid var(--taskon-task-border);
996
- transition: border-color var(--taskon-task-transition);
1546
+ background: var(--taskon-color-bg-surface-subtle);
1547
+ border-radius: var(--taskon-border-radius-lg);
1548
+ border: 1px solid var(--taskon-color-border-secondary);
1549
+ transition: border-color 0.2s ease;
997
1550
  }
998
1551
 
999
1552
  .taskon-task-item:hover {
1000
- border-color: var(--taskon-task-border-hover);
1553
+ border-color: var(--taskon-color-border);
1001
1554
  }
1002
1555
 
1003
1556
  /* ============================================
@@ -1015,7 +1568,7 @@
1015
1568
  width: 78px;
1016
1569
  height: 20px;
1017
1570
  /* 文字样式 */
1018
- color: var(--taskon-recurrence-color);
1571
+ color: var(--taskon-color-primary);
1019
1572
  font-size: 12px;
1020
1573
  line-height: 16px;
1021
1574
  font-weight: 500;
@@ -1027,7 +1580,7 @@
1027
1580
 
1028
1581
  /* 冷却倒计时样式 - 继承标签样式 */
1029
1582
  .taskon-task-item-recurrence .taskon-cooldown-timer {
1030
- color: var(--taskon-recurrence-color);
1583
+ color: var(--taskon-color-primary);
1031
1584
  font-size: 12px;
1032
1585
  line-height: 16px;
1033
1586
  font-weight: 500;
@@ -1055,7 +1608,7 @@
1055
1608
  align-items: center;
1056
1609
  justify-content: center;
1057
1610
  margin-right: 16px;
1058
- color: var(--taskon-task-text-secondary);
1611
+ color: var(--taskon-color-text-tertiary);
1059
1612
  }
1060
1613
 
1061
1614
  .taskon-task-item--completed .taskon-task-item-icon {
@@ -1073,16 +1626,16 @@
1073
1626
  display: inline;
1074
1627
  font-size: 18px;
1075
1628
  font-weight: 500;
1076
- color: var(--taskon-task-text);
1629
+ color: var(--taskon-color-text);
1077
1630
  line-height: 23px;
1078
1631
  overflow-wrap: break-word;
1079
1632
  }
1080
1633
 
1081
1634
  /* Title as link - 参考 Vue 版本 TitleRow.vue 的 OutLink 样式 */
1082
1635
  .taskon-task-item-title--link {
1083
- color: #54aeff;
1636
+ color: var(--taskon-color-link);
1084
1637
  text-decoration: underline;
1085
- transition: opacity var(--taskon-task-transition);
1638
+ transition: opacity 0.2s ease;
1086
1639
  }
1087
1640
 
1088
1641
  .taskon-task-item-title--link:hover {
@@ -1090,14 +1643,14 @@
1090
1643
  }
1091
1644
 
1092
1645
  .taskon-task-item--completed .taskon-task-item-title {
1093
- color: var(--taskon-task-text-secondary);
1646
+ color: var(--taskon-color-text-tertiary);
1094
1647
  }
1095
1648
 
1096
1649
  /* Links in title - 统一蓝色加下划线样式 */
1097
1650
  .taskon-task-item-link {
1098
- color: #54aeff;
1651
+ color: var(--taskon-color-link);
1099
1652
  text-decoration: underline;
1100
- transition: opacity var(--taskon-task-transition);
1653
+ transition: opacity 0.2s ease;
1101
1654
  }
1102
1655
 
1103
1656
  .taskon-task-item-link:hover {
@@ -1110,20 +1663,20 @@
1110
1663
  align-items: center;
1111
1664
  justify-content: center;
1112
1665
  margin-left: 6px;
1113
- color: rgba(255, 255, 255, 0.4);
1666
+ color: var(--taskon-color-text-disabled);
1114
1667
  cursor: help;
1115
1668
  flex-shrink: 0;
1116
1669
  }
1117
1670
 
1118
1671
  .taskon-task-item-title-tip:hover {
1119
- color: rgba(255, 255, 255, 0.6);
1672
+ color: var(--taskon-color-text-tertiary);
1120
1673
  }
1121
1674
 
1122
1675
  /* Right section: Points + Total + Verify */
1123
1676
  .taskon-task-item-right {
1124
1677
  display: flex;
1125
1678
  align-items: center;
1126
- gap: var(--taskon-task-spacing-md);
1679
+ gap: var(--taskon-spacing-md);
1127
1680
  flex-shrink: 0;
1128
1681
  margin-left: 10px;
1129
1682
  }
@@ -1137,24 +1690,24 @@
1137
1690
  align-items: center;
1138
1691
  justify-content: center;
1139
1692
  gap: 2px;
1140
- background: rgba(255, 255, 255, 0.04);
1693
+ background: var(--taskon-color-bg-surface-subtle);
1141
1694
  border-radius: 6px;
1142
1695
  font-size: 16px;
1143
1696
  font-weight: 500;
1144
1697
  }
1145
1698
 
1146
1699
  .taskon-task-item-points-value {
1147
- color: #ffffff;
1700
+ color: var(--taskon-color-text);
1148
1701
  }
1149
1702
 
1150
1703
  /* Points value when task is completed - green color like Vue version */
1151
1704
  .taskon-task-item-points-value--completed {
1152
- color: #00ffa3;
1705
+ color: var(--taskon-color-secondary);
1153
1706
  }
1154
1707
 
1155
1708
  .taskon-task-item-points-time {
1156
1709
  font-size: 12px;
1157
- color: rgba(255, 255, 255, 0.6);
1710
+ color: var(--taskon-color-text-tertiary);
1158
1711
  }
1159
1712
 
1160
1713
  /* Tip icon next to points (margin controlled externally) */
@@ -1165,7 +1718,7 @@
1165
1718
  /* Total points */
1166
1719
  .taskon-task-item-total-points {
1167
1720
  font-size: 12px;
1168
- color: var(--taskon-task-text-muted);
1721
+ color: var(--taskon-color-text-disabled);
1169
1722
  }
1170
1723
 
1171
1724
  /* ============================================
@@ -1178,12 +1731,12 @@
1178
1731
  }
1179
1732
 
1180
1733
  .taskon-task-item-total-earn-text {
1181
- color: rgba(255, 255, 255, 0.6);
1734
+ color: var(--taskon-color-text-tertiary);
1182
1735
  font-size: 14px;
1183
1736
  }
1184
1737
 
1185
1738
  .taskon-task-item-total-earn-value {
1186
- color: #9aff73;
1739
+ color: var(--taskon-color-primary);
1187
1740
  font-size: 14px;
1188
1741
  margin: 0 4px;
1189
1742
  }
@@ -1199,124 +1752,45 @@
1199
1752
  .taskon-task-item-content {
1200
1753
  display: flex;
1201
1754
  flex-direction: column;
1202
- gap: var(--taskon-task-spacing-md);
1755
+ gap: var(--taskon-spacing-md);
1203
1756
  }
1204
1757
 
1205
1758
  .taskon-task-item-desc {
1206
1759
  font-size: 14px;
1207
1760
  line-height: 21px;
1208
- color: var(--taskon-task-text-secondary);
1209
- word-break: break-all;
1210
- white-space: pre-wrap;
1211
- }
1212
-
1213
- .taskon-task-item-desc span {
1214
- color: var(--taskon-task-text);
1215
- word-break: break-all;
1216
- }
1217
-
1218
- /* Rich text content - 参考 Vue 版本 TextPreview.vue */
1219
- .taskon-task-item-rich-text {
1220
- font-size: 14px;
1221
- line-height: 21px;
1222
- color: var(--taskon-task-text-secondary);
1761
+ color: var(--taskon-color-text-tertiary);
1223
1762
  word-break: break-word;
1224
- }
1225
-
1226
- .taskon-task-item-rich-text p {
1227
- margin: 0 0 0.5em 0;
1228
- }
1229
-
1230
- .taskon-task-item-rich-text p:last-child {
1231
- margin-bottom: 0;
1232
- }
1233
-
1234
- .taskon-task-item-rich-text a {
1235
- color: #54aeff;
1236
- text-decoration: underline;
1237
- }
1238
-
1239
- .taskon-task-item-rich-text a:hover {
1240
- opacity: 0.8;
1241
- }
1242
-
1243
- .taskon-task-item-rich-text strong,
1244
- .taskon-task-item-rich-text b {
1245
- font-weight: 600;
1246
- color: var(--taskon-task-text);
1247
- }
1248
-
1249
- .taskon-task-item-rich-text em,
1250
- .taskon-task-item-rich-text i {
1251
- font-style: italic;
1252
- }
1253
-
1254
- .taskon-task-item-rich-text ul,
1255
- .taskon-task-item-rich-text ol {
1256
- margin: 0.5em 0;
1257
- padding-left: 1.5em;
1258
- }
1259
-
1260
- .taskon-task-item-rich-text li {
1261
- margin: 0.25em 0;
1262
- }
1263
-
1264
- .taskon-task-item-rich-text code {
1265
- background: rgba(255, 255, 255, 0.1);
1266
- padding: 0.2em 0.4em;
1267
- border-radius: 3px;
1268
- font-size: 0.9em;
1269
- }
1270
-
1271
- .taskon-task-item-rich-text pre {
1272
- background: rgba(255, 255, 255, 0.05);
1273
- padding: 0.75em 1em;
1274
- border-radius: 6px;
1275
- overflow-x: auto;
1276
- margin: 0.5em 0;
1277
- }
1278
-
1279
- .taskon-task-item-rich-text blockquote {
1280
- border-left: 3px solid var(--taskon-color-primary);
1281
- padding-left: 1em;
1282
- margin: 0.5em 0;
1283
- color: var(--taskon-task-text-muted);
1284
- }
1285
-
1286
- .taskon-task-item-rich-text img {
1287
- max-width: 100%;
1288
- height: auto;
1289
- border-radius: 6px;
1763
+ white-space: pre-wrap;
1290
1764
  }
1291
1765
 
1292
1766
  /* Description fields */
1293
1767
  .taskon-task-item-fields {
1294
1768
  display: flex;
1295
1769
  flex-direction: column;
1296
- gap: var(--taskon-task-spacing-xs);
1770
+ gap: var(--taskon-spacing-xs);
1297
1771
  }
1298
1772
 
1299
1773
  .taskon-task-item-field {
1300
1774
  display: flex;
1301
1775
  align-items: baseline;
1302
- gap: var(--taskon-task-spacing-sm);
1776
+ gap: var(--taskon-spacing-sm);
1303
1777
  font-size: 13px;
1304
1778
  }
1305
1779
 
1306
1780
  .taskon-task-item-field-key {
1307
- color: var(--taskon-task-text-muted);
1781
+ color: var(--taskon-color-text-disabled);
1308
1782
  flex-shrink: 0;
1309
1783
  }
1310
1784
 
1311
1785
  .taskon-task-item-field-value {
1312
- color: var(--taskon-task-text);
1786
+ color: var(--taskon-color-text);
1313
1787
  word-break: break-all;
1314
1788
  }
1315
1789
 
1316
1790
  .taskon-task-item-field-value--link {
1317
- color: #54aeff;
1791
+ color: var(--taskon-color-link);
1318
1792
  text-decoration: underline;
1319
- transition: opacity var(--taskon-task-transition);
1793
+ transition: opacity 0.2s ease;
1320
1794
  }
1321
1795
 
1322
1796
  .taskon-task-item-field-value--link:hover {
@@ -1327,21 +1801,21 @@
1327
1801
  .taskon-task-item-action-link {
1328
1802
  display: inline-flex;
1329
1803
  align-items: center;
1330
- padding: var(--taskon-task-spacing-sm) var(--taskon-task-spacing-md);
1804
+ padding: var(--taskon-spacing-sm) var(--taskon-spacing-md);
1331
1805
  font-size: 13px;
1332
1806
  font-weight: 500;
1333
1807
  color: var(--taskon-color-primary);
1334
1808
  background: transparent;
1335
1809
  border: 1px solid var(--taskon-color-primary);
1336
- border-radius: 6px;
1810
+ border-radius: var(--taskon-border-radius);
1337
1811
  text-decoration: none;
1338
- transition: all var(--taskon-task-transition);
1812
+ transition: all 0.2s ease;
1339
1813
  align-self: flex-start;
1340
1814
  }
1341
1815
 
1342
1816
  .taskon-task-item-action-link:hover {
1343
1817
  background: var(--taskon-color-primary);
1344
- color: white;
1818
+ color: var(--taskon-color-text-on-primary);
1345
1819
  }
1346
1820
 
1347
1821
  /* Spinner animation */
@@ -1379,7 +1853,7 @@
1379
1853
  .taskon-cooldown-timer {
1380
1854
  display: inline-flex;
1381
1855
  align-items: center;
1382
- gap: var(--taskon-task-spacing-xs);
1856
+ gap: var(--taskon-spacing-xs);
1383
1857
  font-size: 13px;
1384
1858
  color: var(--taskon-color-warning);
1385
1859
  }
@@ -1391,24 +1865,24 @@
1391
1865
  display: inline-flex;
1392
1866
  align-items: center;
1393
1867
  justify-content: center;
1394
- gap: 4px;
1868
+ gap: var(--taskon-spacing-xs);
1395
1869
  height: 34px;
1396
- padding: 0 12px;
1870
+ padding: 0 var(--taskon-spacing-md);
1397
1871
  font-size: 14px;
1398
1872
  font-weight: 500;
1399
1873
  line-height: 20px;
1400
- color: #fff;
1874
+ color: var(--taskon-color-text);
1401
1875
  background: transparent;
1402
- border: 1px solid rgba(255, 255, 255, 0.1);
1403
- border-radius: 6px;
1876
+ border: 1px solid var(--taskon-color-border);
1877
+ border-radius: var(--taskon-border-radius);
1404
1878
  cursor: pointer;
1405
- transition: all var(--taskon-task-transition);
1879
+ transition: all 0.2s ease;
1406
1880
  white-space: nowrap;
1407
1881
  flex-shrink: 0;
1408
1882
  }
1409
1883
 
1410
1884
  .taskon-verify-btn:hover:not(:disabled) {
1411
- border-color: rgba(255, 255, 255, 0.3);
1885
+ border-color: var(--taskon-color-text-disabled);
1412
1886
  }
1413
1887
 
1414
1888
  .taskon-verify-btn:disabled {
@@ -1441,16 +1915,16 @@
1441
1915
  .taskon-expandable-toggle {
1442
1916
  display: inline-flex;
1443
1917
  align-items: center;
1444
- gap: 4px;
1918
+ gap: var(--taskon-spacing-xs);
1445
1919
  padding: 0;
1446
- margin-top: 8px;
1920
+ margin-top: var(--taskon-spacing-sm);
1447
1921
  font-size: 13px;
1448
1922
  font-weight: 500;
1449
- color: #ffffff;
1923
+ color: var(--taskon-color-text);
1450
1924
  background: transparent;
1451
1925
  border: none;
1452
1926
  cursor: pointer;
1453
- transition: opacity var(--taskon-task-transition);
1927
+ transition: opacity 0.2s ease;
1454
1928
  align-self: flex-start;
1455
1929
  }
1456
1930
 
@@ -1463,7 +1937,7 @@
1463
1937
  }
1464
1938
 
1465
1939
  .taskon-expandable-toggle-icon {
1466
- transition: transform var(--taskon-task-transition);
1940
+ transition: transform 0.2s ease;
1467
1941
  flex-shrink: 0;
1468
1942
  }
1469
1943
 
@@ -1532,12 +2006,12 @@
1532
2006
  }
1533
2007
 
1534
2008
  .taskon-task-time-range-label {
1535
- color: var(--taskon-task-text-secondary);
2009
+ color: var(--taskon-color-text-tertiary);
1536
2010
  }
1537
2011
 
1538
2012
  .taskon-task-time-range-value {
1539
2013
  display: inline-block;
1540
- color: rgba(255, 212, 101, 1);
2014
+ color: var(--taskon-color-warning);
1541
2015
  }
1542
2016
 
1543
2017
  /* ============================================
@@ -1548,7 +2022,7 @@
1548
2022
  position: relative;
1549
2023
  display: inline-block;
1550
2024
  overflow: hidden;
1551
- border-radius: 6px;
2025
+ border-radius: var(--taskon-border-radius);
1552
2026
  }
1553
2027
 
1554
2028
  .taskon-verify-btn-progress {
@@ -1561,8 +2035,35 @@
1561
2035
 
1562
2036
  .taskon-verify-btn-progress-bar {
1563
2037
  height: 100%;
1564
- border-radius: 6px;
1565
- background: linear-gradient(to right, #cbff01, #00ffa3);
2038
+ border-radius: var(--taskon-border-radius);
2039
+ background: linear-gradient(
2040
+ to right,
2041
+ var(--taskon-color-primary),
2042
+ var(--taskon-color-secondary)
2043
+ );
2044
+ }
2045
+ /**
2046
+ * RewardModuleDialog styles
2047
+ * Scope UserCenter module styles inside Quest popup
2048
+ */
2049
+
2050
+ .taskon-quest-reward-dialog .taskon-user-center {
2051
+ padding: 32px 0 0 0;
2052
+ background: transparent;
2053
+ border-radius: 0;
2054
+ gap: 24px;
2055
+ }
2056
+
2057
+ .taskon-quest-reward-dialog .taskon-my-rewards {
2058
+ gap: 24px;
2059
+ }
2060
+
2061
+ .taskon-quest-reward-dialog .taskon-my-rewards__section {
2062
+ gap: 16px;
2063
+ }
2064
+
2065
+ .taskon-quest-reward-dialog .taskon-points-list {
2066
+ background: transparent;
1566
2067
  }
1567
2068
  /**
1568
2069
  * BlindBox 盲盒组件样式
@@ -1895,10 +2396,6 @@
1895
2396
  /**
1896
2397
  * Eligibility (资格验证) 组件样式
1897
2398
  * @description Standalone CSS for EligibilityInfo component, usable in any widget context.
1898
- *
1899
- * CSS variable fallbacks ensure correct rendering even outside Quest widget
1900
- * (e.g., when used in TaskChain). When rendered inside .taskon-quest,
1901
- * the Quest-defined variables take precedence.
1902
2399
  */
1903
2400
 
1904
2401
  /* ============================================================================
@@ -1908,7 +2405,7 @@
1908
2405
  .taskon-quest-eligs {
1909
2406
  margin-top: 25px;
1910
2407
  padding: 0 18px;
1911
- border: 1px solid var(--taskon-quest-text-darkest, rgba(255, 255, 255, 0.1));
2408
+ border: 1px solid var(--taskon-color-border);
1912
2409
  border-radius: 10px;
1913
2410
  }
1914
2411
 
@@ -1919,10 +2416,10 @@
1919
2416
 
1920
2417
  @keyframes taskon-quest-eligs-glow {
1921
2418
  0% {
1922
- border-color: var(--taskon-quest-text-darkest, rgba(255, 255, 255, 0.1));
2419
+ border-color: var(--taskon-color-border);
1923
2420
  }
1924
2421
  100% {
1925
- border-color: rgba(255, 255, 255, 0.4);
2422
+ border-color: var(--taskon-color-primary);
1926
2423
  }
1927
2424
  }
1928
2425
 
@@ -1953,12 +2450,12 @@
1953
2450
  /* 头部文本 */
1954
2451
  .taskon-quest-eligs-header-text {
1955
2452
  flex: 1;
1956
- color: var(--taskon-quest-text-lightest, #ffffff);
2453
+ color: var(--taskon-color-text);
1957
2454
  }
1958
2455
 
1959
2456
  /* 高亮表达式 (all/any) */
1960
2457
  .taskon-quest-eligs-header-express {
1961
- color: var(--taskon-quest-secondary, #1affab);
2458
+ color: var(--taskon-color-secondary);
1962
2459
  }
1963
2460
 
1964
2461
  /* ============================================================================
@@ -1974,16 +2471,16 @@
1974
2471
  padding: 0;
1975
2472
  margin-left: auto;
1976
2473
  background: transparent;
1977
- border: 1px solid var(--taskon-quest-text-darkest, rgba(255, 255, 255, 0.1));
2474
+ border: 1px solid var(--taskon-color-border);
1978
2475
  border-radius: 6px;
1979
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2476
+ color: var(--taskon-color-text-secondary);
1980
2477
  cursor: pointer;
1981
2478
  transition: all 0.2s;
1982
2479
  }
1983
2480
 
1984
2481
  .taskon-quest-eligs-refresh:hover:not(:disabled) {
1985
- border-color: var(--taskon-quest-text-light, rgba(255, 255, 255, 0.6));
1986
- color: var(--taskon-quest-text-lightest, #ffffff);
2482
+ border-color: var(--taskon-color-text-tertiary);
2483
+ color: var(--taskon-color-text);
1987
2484
  }
1988
2485
 
1989
2486
  .taskon-quest-eligs-refresh:disabled {
@@ -2009,7 +2506,7 @@
2009
2506
  flex-shrink: 0;
2010
2507
  width: 6px;
2011
2508
  height: 10px;
2012
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2509
+ color: var(--taskon-color-text-secondary);
2013
2510
  transform: rotate(90deg);
2014
2511
  transition: transform 0.3s;
2015
2512
  }
@@ -2027,7 +2524,7 @@
2027
2524
  padding: 20px 0;
2028
2525
  margin: 0;
2029
2526
  list-style: none;
2030
- border-top: 1px solid var(--taskon-quest-text-darkest, rgba(255, 255, 255, 0.1));
2527
+ border-top: 1px solid var(--taskon-color-border);
2031
2528
  }
2032
2529
 
2033
2530
  /* 单项 */
@@ -2065,12 +2562,28 @@
2065
2562
  opacity: 1;
2066
2563
  }
2067
2564
 
2565
+ .taskon-quest-eligs-item-icon--passed {
2566
+ color: var(--taskon-color-success);
2567
+ }
2568
+
2569
+ .taskon-quest-eligs-item-icon--failed {
2570
+ color: var(--taskon-color-error);
2571
+ }
2572
+
2573
+ .taskon-quest-eligs-header-status--passed {
2574
+ color: var(--taskon-color-success);
2575
+ }
2576
+
2577
+ .taskon-quest-eligs-header-status--failed {
2578
+ color: var(--taskon-color-error);
2579
+ }
2580
+
2068
2581
  /* 内容区 */
2069
2582
  .taskon-quest-eligs-item-content {
2070
2583
  flex: 1;
2071
2584
  font-size: 14px;
2072
2585
  line-height: 18px;
2073
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2586
+ color: var(--taskon-color-text-secondary);
2074
2587
  }
2075
2588
 
2076
2589
  /* ============================================================================
@@ -2078,7 +2591,7 @@
2078
2591
  ============================================================================ */
2079
2592
 
2080
2593
  .taskon-quest-eligs-type {
2081
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2594
+ color: var(--taskon-color-text-secondary);
2082
2595
  }
2083
2596
 
2084
2597
  .taskon-quest-eligs-type--tooltip {
@@ -2088,12 +2601,12 @@
2088
2601
 
2089
2602
  /* 高亮文本 */
2090
2603
  .taskon-quest-eligs-highlight {
2091
- color: var(--taskon-quest-primary, #cbff01);
2604
+ color: var(--taskon-color-primary);
2092
2605
  }
2093
2606
 
2094
2607
  /* 链接样式 */
2095
2608
  .taskon-quest-eligs-link {
2096
- color: var(--taskon-quest-link, #58afff);
2609
+ color: var(--taskon-color-link);
2097
2610
  text-decoration: underline;
2098
2611
  }
2099
2612
 
@@ -2112,10 +2625,10 @@
2112
2625
  max-width: 300px;
2113
2626
  font-size: 12px;
2114
2627
  line-height: 16px;
2115
- color: var(--taskon-quest-text-lightest, #ffffff);
2116
- background-color: rgba(0, 0, 0, 0.9);
2628
+ color: var(--taskon-color-text);
2629
+ background-color: var(--taskon-color-bg-floating);
2117
2630
  border-radius: 6px;
2118
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
2631
+ box-shadow: 0 2px 8px var(--taskon-color-bg-mask);
2119
2632
  white-space: normal;
2120
2633
  word-break: break-word;
2121
2634
  }
@@ -2148,7 +2661,7 @@
2148
2661
  flex-shrink: 0;
2149
2662
  width: 8px;
2150
2663
  height: 8px;
2151
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2664
+ color: var(--taskon-color-text-secondary);
2152
2665
  transform: rotate(-90deg);
2153
2666
  transition: transform 0.3s;
2154
2667
  }
@@ -2169,7 +2682,7 @@
2169
2682
  .taskon-quest-eligs-sub-list li {
2170
2683
  font-size: 14px;
2171
2684
  line-height: 18px;
2172
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2685
+ color: var(--taskon-color-text-secondary);
2173
2686
  }
2174
2687
 
2175
2688
  /* ============================================================================
@@ -2228,11 +2741,11 @@
2228
2741
  display: inline;
2229
2742
  text-decoration: underline;
2230
2743
  cursor: pointer;
2231
- color: var(--taskon-quest-text-lightest, #ffffff);
2744
+ color: var(--taskon-color-text);
2232
2745
  }
2233
2746
 
2234
2747
  .taskon-quest-eligs-onchain-link:hover {
2235
- color: var(--taskon-quest-link, #58afff);
2748
+ color: var(--taskon-color-link);
2236
2749
  }
2237
2750
 
2238
2751
  .taskon-quest-eligs-onchain-tooltip {
@@ -2241,10 +2754,10 @@
2241
2754
  left: 0;
2242
2755
  min-width: 260px;
2243
2756
  padding: 12px 16px;
2244
- background-color: #222222;
2245
- border: 1px solid rgba(255, 255, 255, 0.1);
2246
- border-radius: var(--taskon-quest-radius-l, 8px);
2247
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
2757
+ background-color: var(--taskon-color-bg-surface);
2758
+ border: 1px solid var(--taskon-color-border);
2759
+ border-radius: var(--taskon-border-radius);
2760
+ box-shadow: 0 4px 16px var(--taskon-color-bg-mask);
2248
2761
  z-index: 100;
2249
2762
  font-size: 14px;
2250
2763
  line-height: 1.5;
@@ -2257,15 +2770,15 @@
2257
2770
  left: 16px;
2258
2771
  width: 12px;
2259
2772
  height: 12px;
2260
- background-color: #222222;
2261
- border-right: 1px solid rgba(255, 255, 255, 0.1);
2262
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
2773
+ background-color: var(--taskon-color-bg-surface);
2774
+ border-right: 1px solid var(--taskon-color-border);
2775
+ border-bottom: 1px solid var(--taskon-color-border);
2263
2776
  transform: rotate(45deg);
2264
2777
  }
2265
2778
 
2266
2779
  .taskon-quest-eligs-onchain-tooltip p {
2267
2780
  margin: 0 0 8px 0;
2268
- color: var(--taskon-quest-text-lighter, rgba(255, 255, 255, 0.8));
2781
+ color: var(--taskon-color-text-secondary);
2269
2782
  }
2270
2783
 
2271
2784
  .taskon-quest-eligs-onchain-tooltip ul {
@@ -2280,14 +2793,14 @@
2280
2793
  }
2281
2794
 
2282
2795
  .taskon-quest-eligs-onchain-tooltip-link {
2283
- color: var(--taskon-quest-link, #58afff);
2796
+ color: var(--taskon-color-link);
2284
2797
  text-decoration: underline;
2285
2798
  font-size: 14px;
2286
2799
  line-height: 18px;
2287
2800
  }
2288
2801
 
2289
2802
  .taskon-quest-eligs-onchain-tooltip-link:hover {
2290
- color: var(--taskon-quest-text-lightest, #ffffff);
2803
+ color: var(--taskon-color-text);
2291
2804
  }
2292
2805
 
2293
2806
  /* ============================================================================
@@ -2301,13 +2814,13 @@
2301
2814
  .taskon-quest-eligs-nft-name {
2302
2815
  position: relative;
2303
2816
  display: inline;
2304
- color: var(--taskon-quest-secondary, #1affab);
2817
+ color: var(--taskon-color-secondary);
2305
2818
  cursor: pointer;
2306
2819
  text-decoration: underline;
2307
2820
  }
2308
2821
 
2309
2822
  .taskon-quest-eligs-nft-name:hover {
2310
- color: var(--taskon-quest-link, #58afff);
2823
+ color: var(--taskon-color-link);
2311
2824
  }
2312
2825
 
2313
2826
  .taskon-quest-eligs-copied {
@@ -2316,10 +2829,10 @@
2316
2829
  left: 50%;
2317
2830
  transform: translateX(-50%);
2318
2831
  padding: 4px 8px;
2319
- background-color: #222222;
2320
- border-radius: var(--taskon-quest-radius-s, 4px);
2832
+ background-color: var(--taskon-color-bg-surface);
2833
+ border-radius: var(--taskon-border-radius-sm);
2321
2834
  font-size: 12px;
2322
- color: var(--taskon-quest-secondary, #1affab);
2835
+ color: var(--taskon-color-secondary);
2323
2836
  white-space: nowrap;
2324
2837
  pointer-events: none;
2325
2838
  animation: taskon-quest-eligs-fade-in 0.2s ease-out;