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

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 (27) hide show
  1. package/README.md +1 -1
  2. package/dist/CommunityTaskList.css +1222 -1174
  3. package/dist/EligibilityInfo.css +443 -263
  4. package/dist/LeaderboardWidget.css +355 -152
  5. package/dist/Quest.css +690 -408
  6. package/dist/TaskOnProvider.css +35 -16
  7. package/dist/UserCenterWidget.css +116 -71
  8. package/dist/UserCenterWidget2.css +1285 -748
  9. package/dist/chunks/{CommunityTaskList-C9mPl_31.js → CommunityTaskList-C9Gv8KOF.js} +65 -17
  10. package/dist/chunks/{EligibilityInfo-DGBffKN8.js → EligibilityInfo-D-Fuy9GE.js} +4 -4
  11. package/dist/chunks/{LeaderboardWidget-DPOQVXkT.js → LeaderboardWidget-BV2D2q1N.js} +2 -2
  12. package/dist/chunks/{PageBuilder-WCZvxL2j.js → PageBuilder-DQoU4Mwf.js} +5 -5
  13. package/dist/chunks/{Quest-DjGH_8bx.js → Quest-B5NyVr3o.js} +56 -15
  14. package/dist/chunks/{TaskOnProvider-iannERG1.js → TaskOnProvider-93UxARFo.js} +1 -1
  15. package/dist/chunks/{ThemeProvider-DNJqI2lD.js → ThemeProvider-CPI_roeh.js} +3 -3
  16. package/dist/chunks/{UserCenterWidget-CAhgp46j.js → UserCenterWidget-BRtigY_S.js} +6 -5
  17. package/dist/chunks/{UserCenterWidget-B0O-f_xl.js → UserCenterWidget-cADBSVg7.js} +21 -7
  18. package/dist/chunks/{dynamic-import-helper-B2j_dZ4V.js → dynamic-import-helper-DwXlQC0S.js} +1 -1
  19. package/dist/community-task.js +1 -1
  20. package/dist/core.js +2 -2
  21. package/dist/dynamic-import-helper.css +424 -303
  22. package/dist/index.js +9 -9
  23. package/dist/leaderboard.js +2 -2
  24. package/dist/page-builder.js +1 -1
  25. package/dist/quest.js +1 -1
  26. package/dist/user-center.js +5 -5
  27. package/package.json +4 -1
package/dist/Quest.css CHANGED
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  /* ========== 容器 ========== */
9
+
9
10
  .taskon-button-tabs {
10
11
  display: inline-flex;
11
12
  align-items: center;
@@ -13,14 +14,15 @@
13
14
  }
14
15
 
15
16
  /* ========== Tab 按钮基础样式 ========== */
17
+
16
18
  .taskon-button-tabs__tab {
17
19
  flex-shrink: 0;
18
20
  display: inline-flex;
19
21
  align-items: center;
20
22
  justify-content: center;
21
23
  background-color: transparent;
22
- border: 1px solid rgba(255, 255, 255, 0.2);
23
- color: rgba(255, 255, 255, 0.6);
24
+ border: 1px solid var(--taskon-color-border);
25
+ color: var(--taskon-color-text-secondary);
24
26
  font-weight: 500;
25
27
  white-space: nowrap;
26
28
  cursor: pointer;
@@ -30,6 +32,7 @@
30
32
  /* ========== 尺寸变体 ========== */
31
33
 
32
34
  /* Small 尺寸 */
35
+
33
36
  .taskon-button-tabs__tab--small {
34
37
  height: 32px;
35
38
  padding: 4px 12px;
@@ -39,6 +42,7 @@
39
42
  }
40
43
 
41
44
  /* Medium 尺寸 */
45
+
42
46
  .taskon-button-tabs__tab--medium {
43
47
  height: 36px;
44
48
  padding: 6px 16px;
@@ -50,16 +54,18 @@
50
54
  /* ========== 状态样式 ========== */
51
55
 
52
56
  /* Hover 状态(未选中) */
57
+
53
58
  .taskon-button-tabs__tab:hover:not(.taskon-button-tabs__tab--active):not(.taskon-button-tabs__tab--disabled) {
54
- border-color: rgba(255, 255, 255, 0.6);
55
- color: rgba(255, 255, 255, 0.8);
59
+ border-color: var(--taskon-color-border-secondary);
60
+ color: var(--taskon-color-text);
56
61
  }
57
62
 
58
63
  /* 选中状态 (light-border) */
64
+
59
65
  .taskon-button-tabs__tab--active {
60
66
  background-color: transparent;
61
- border-color: #ffffff;
62
- color: #ffffff;
67
+ border-color: var(--taskon-color-text);
68
+ color: var(--taskon-color-text);
63
69
  }
64
70
 
65
71
  .taskon-button-tabs__tab--active:hover {
@@ -67,9 +73,10 @@
67
73
  }
68
74
 
69
75
  /* 禁用状态 */
76
+
70
77
  .taskon-button-tabs__tab--disabled {
71
- color: rgba(255, 255, 255, 0.3);
72
- border-color: rgba(255, 255, 255, 0.1);
78
+ color: var(--taskon-color-text-disabled);
79
+ border-color: var(--taskon-color-border-secondary);
73
80
  cursor: not-allowed;
74
81
  }
75
82
  /* CompletedCount - 完成计数组件样式 */
@@ -78,20 +85,18 @@
78
85
  align-items: center;
79
86
  gap: 8px;
80
87
  }
81
-
82
88
  .taskon-completed-count-check {
83
89
  width: 12px;
84
90
  height: 9px;
91
+ color: var(--taskon-color-success);
85
92
  }
86
-
87
93
  .taskon-completed-count-text {
88
94
  font-size: 14px;
89
95
  line-height: 18px;
90
- color: rgba(255, 255, 255, 0.6);
96
+ color: var(--taskon-color-text-secondary);
91
97
  }
92
-
93
98
  .taskon-completed-count-em {
94
- color: #fff;
99
+ color: var(--taskon-color-text);
95
100
  }
96
101
  /**
97
102
  * EligsNotPassDialog 样式
@@ -99,6 +104,7 @@
99
104
  */
100
105
 
101
106
  /* 弹窗容器 */
107
+
102
108
  .taskon-eligs-dialog-container {
103
109
  display: flex;
104
110
  flex-direction: column;
@@ -107,6 +113,7 @@
107
113
  }
108
114
 
109
115
  /* 头部图标和标题 */
116
+
110
117
  .taskon-eligs-dialog-header {
111
118
  display: flex;
112
119
  flex-direction: column;
@@ -127,6 +134,7 @@
127
134
  }
128
135
 
129
136
  /* 描述文本 */
137
+
130
138
  .taskon-eligs-dialog-desc {
131
139
  margin: 0;
132
140
  font-size: 14px;
@@ -145,10 +153,11 @@
145
153
  }
146
154
 
147
155
  /* 资格条件区域 */
156
+
148
157
  .taskon-eligs-dialog-eligs {
149
158
  width: 100%;
150
159
  border: 1px solid var(--taskon-color-border);
151
- border-radius: 10px;
160
+ border-radius: var(--taskon-border-radius-lg);
152
161
  overflow: hidden;
153
162
  }
154
163
 
@@ -198,12 +207,13 @@
198
207
  }
199
208
 
200
209
  /* 底部按钮 */
210
+
201
211
  .taskon-eligs-dialog-button {
202
212
  width: 100%;
203
213
  height: 48px;
204
214
  padding: 0 24px;
205
215
  border: none;
206
- border-radius: 8px;
216
+ border-radius: var(--taskon-border-radius);
207
217
  background: var(--taskon-color-primary);
208
218
  color: var(--taskon-color-text-on-primary);
209
219
  font-size: 16px;
@@ -256,6 +266,7 @@
256
266
  }
257
267
 
258
268
  /* Eligibility 条件列表区域 */
269
+
259
270
  .taskon-eligs-bind-eligs-section {
260
271
  margin-bottom: 20px;
261
272
  padding-bottom: 20px;
@@ -270,6 +281,7 @@
270
281
  }
271
282
 
272
283
  /* 提示文本 */
284
+
273
285
  .taskon-eligs-bind-tip {
274
286
  margin: 0 0 20px;
275
287
  font-size: 14px;
@@ -278,6 +290,7 @@
278
290
  }
279
291
 
280
292
  /* 绑定区域 */
293
+
281
294
  .taskon-eligs-bind-section {
282
295
  margin-bottom: 20px;
283
296
  }
@@ -290,6 +303,7 @@
290
303
  }
291
304
 
292
305
  /* 绑定列表 */
306
+
293
307
  .taskon-eligs-bind-list {
294
308
  display: flex;
295
309
  flex-direction: column;
@@ -297,13 +311,14 @@
297
311
  }
298
312
 
299
313
  /* 单个绑定项 */
314
+
300
315
  .taskon-eligs-bind-item {
301
316
  display: flex;
302
317
  align-items: center;
303
318
  justify-content: space-between;
304
319
  padding: 12px 16px;
305
320
  background: var(--taskon-color-bg-surface-strong);
306
- border-radius: 8px;
321
+ border-radius: var(--taskon-border-radius);
307
322
  border: 1px solid var(--taskon-color-border);
308
323
  }
309
324
 
@@ -319,6 +334,7 @@
319
334
  }
320
335
 
321
336
  /* 绑定按钮 */
337
+
322
338
  .taskon-eligs-bind-item-btn {
323
339
  display: inline-flex;
324
340
  align-items: center;
@@ -333,7 +349,7 @@
333
349
  var(--taskon-color-secondary) 100%
334
350
  );
335
351
  border: none;
336
- border-radius: 6px;
352
+ border-radius: var(--taskon-border-radius-sm);
337
353
  cursor: pointer;
338
354
  transition: opacity 0.2s;
339
355
  }
@@ -348,6 +364,7 @@
348
364
  }
349
365
 
350
366
  /* 绑定中的加载动画 */
367
+
351
368
  .taskon-eligs-bind-item-spinner {
352
369
  width: 14px;
353
370
  height: 14px;
@@ -364,6 +381,7 @@
364
381
  }
365
382
 
366
383
  /* 已绑定状态 */
384
+
367
385
  .taskon-eligs-bind-item-status {
368
386
  display: inline-flex;
369
387
  align-items: center;
@@ -379,6 +397,7 @@
379
397
  */
380
398
 
381
399
  /* 分享触发按钮 - 方形图标按钮(SimpleBox 样式) */
400
+
382
401
  .taskon-quest-share-trigger {
383
402
  display: flex;
384
403
  align-items: center;
@@ -389,7 +408,7 @@
389
408
  margin-left: auto;
390
409
  background: var(--taskon-color-bg-surface);
391
410
  border: none;
392
- border-radius: 6px;
411
+ border-radius: var(--taskon-border-radius-sm);
393
412
  cursor: pointer;
394
413
  transition: background 0.2s;
395
414
  flex-shrink: 0;
@@ -404,10 +423,11 @@
404
423
  }
405
424
 
406
425
  /* 下拉菜单 */
426
+
407
427
  .taskon-quest-share-menu {
408
428
  width: 230px;
409
429
  background: var(--taskon-color-bg-surface);
410
- border-radius: 10px;
430
+ border-radius: var(--taskon-border-radius-lg);
411
431
  overflow: hidden;
412
432
  box-shadow: 0 4px 16px var(--taskon-color-bg-mask);
413
433
  z-index: 100;
@@ -415,6 +435,7 @@
415
435
  }
416
436
 
417
437
  /* 菜单项 */
438
+
418
439
  .taskon-quest-share-menu-item {
419
440
  display: flex;
420
441
  align-items: center;
@@ -457,6 +478,7 @@
457
478
  ============================================================================ */
458
479
 
459
480
  /* 覆盖 Dialog 默认样式 - 移除卡片背景,让内容区域完全透明 */
481
+
460
482
  .taskon-quest-qr-dialog-content {
461
483
  background: transparent !important;
462
484
  border-radius: 0 !important;
@@ -474,17 +496,20 @@
474
496
  }
475
497
 
476
498
  /* 海报外层容器 */
499
+
477
500
  .taskon-quest-qr-poster-outer {
478
- border-radius: 12px;
501
+ border-radius: var(--taskon-border-radius-lg);
479
502
  overflow: hidden;
480
503
  }
481
504
 
482
505
  /* 海报内容 */
506
+
483
507
  .taskon-quest-qr-poster {
484
508
  width: 100%;
485
509
  }
486
510
 
487
511
  /* 海报顶部 - 绿色渐变区域 */
512
+
488
513
  .taskon-quest-qr-poster-header {
489
514
  background: linear-gradient(
490
515
  89.87deg,
@@ -496,6 +521,7 @@
496
521
  }
497
522
 
498
523
  /* 社区信息 */
524
+
499
525
  .taskon-quest-qr-owner {
500
526
  display: flex;
501
527
  align-items: center;
@@ -519,6 +545,7 @@
519
545
  }
520
546
 
521
547
  /* 活动名称 */
548
+
522
549
  .taskon-quest-qr-campaign-name {
523
550
  margin-top: 14px;
524
551
  margin-bottom: 8px;
@@ -534,13 +561,15 @@
534
561
  }
535
562
 
536
563
  /* Banner 图片 */
564
+
537
565
  .taskon-quest-qr-banner {
538
566
  width: 100%;
539
- border-radius: 10px;
567
+ border-radius: var(--taskon-border-radius-lg);
540
568
  display: block;
541
569
  }
542
570
 
543
571
  /* 海报底部 - 黑色区域 */
572
+
544
573
  .taskon-quest-qr-poster-footer {
545
574
  padding: 30px;
546
575
  background: var(--taskon-color-bg-canvas);
@@ -550,11 +579,13 @@
550
579
  }
551
580
 
552
581
  /* 信息区域 */
582
+
553
583
  .taskon-quest-qr-info {
554
584
  width: calc(100% - 80px);
555
585
  }
556
586
 
557
587
  /* 奖励标题 */
588
+
558
589
  .taskon-quest-qr-reward-title {
559
590
  display: flex;
560
591
  align-items: center;
@@ -567,6 +598,7 @@
567
598
  }
568
599
 
569
600
  /* 时间范围 */
601
+
570
602
  .taskon-quest-qr-time {
571
603
  display: flex;
572
604
  align-items: center;
@@ -583,10 +615,11 @@
583
615
  }
584
616
 
585
617
  /* 二维码 */
618
+
586
619
  .taskon-quest-qr-code {
587
620
  width: 80px;
588
621
  height: 80px;
589
- border-radius: 6px;
622
+ border-radius: var(--taskon-border-radius-sm);
590
623
  overflow: hidden;
591
624
  flex-shrink: 0;
592
625
  }
@@ -598,6 +631,7 @@
598
631
  }
599
632
 
600
633
  /* 操作按钮 */
634
+
601
635
  .taskon-quest-qr-actions {
602
636
  display: grid;
603
637
  grid-template-columns: 1fr 1fr;
@@ -607,6 +641,7 @@
607
641
  }
608
642
 
609
643
  /* 奖励列表 - 与原版 RewardsLabels.vue 一致 */
644
+
610
645
  .taskon-quest-qr-rewards-list {
611
646
  display: inline-flex;
612
647
  align-items: center;
@@ -617,6 +652,7 @@
617
652
  }
618
653
 
619
654
  /* 单个奖励项 */
655
+
620
656
  .taskon-quest-qr-reward-item {
621
657
  display: inline-flex;
622
658
  align-items: center;
@@ -627,11 +663,13 @@
627
663
  }
628
664
 
629
665
  /* 奖励标签 - 高亮绿色 */
666
+
630
667
  .taskon-quest-qr-reward-label {
631
668
  color: var(--taskon-color-primary);
632
669
  }
633
670
 
634
671
  /* 链图标 */
672
+
635
673
  .taskon-quest-qr-reward-chain-icon {
636
674
  width: 15px;
637
675
  height: 15px;
@@ -640,6 +678,7 @@
640
678
  }
641
679
 
642
680
  /* 奖励间的 & 符号 */
681
+
643
682
  .taskon-quest-qr-reward-and {
644
683
  margin-left: 6px;
645
684
  color: var(--taskon-color-text);
@@ -731,6 +770,7 @@
731
770
  }
732
771
 
733
772
  /* Winners 行可点击样式 */
773
+
734
774
  .taskon-quest-participants-info-row--clickable {
735
775
  padding: 0;
736
776
  margin: 0;
@@ -761,6 +801,7 @@
761
801
  }
762
802
 
763
803
  /* Winners 行的可点击值样式 */
804
+
764
805
  .taskon-quest-participants-info-value--clickable {
765
806
  display: flex;
766
807
  align-items: center;
@@ -814,6 +855,7 @@
814
855
  }
815
856
 
816
857
  /* Flow Chart */
858
+
817
859
  .taskon-quest-participants-dialog-chart {
818
860
  display: flex;
819
861
  align-items: flex-start;
@@ -876,6 +918,7 @@
876
918
  }
877
919
 
878
920
  /* Confirm Button */
921
+
879
922
  .taskon-quest-participants-dialog-btn {
880
923
  width: 100%;
881
924
  }
@@ -1112,13 +1155,27 @@
1112
1155
  * - 状态修饰:.taskon-quest-rewards-{element}--{state}
1113
1156
  */
1114
1157
 
1158
+ /*
1159
+ * Responsive base styles
1160
+ *
1161
+ * Keep mobile breakpoints and fallback patterns centralized here.
1162
+ * Components should reuse these mixins instead of duplicating query logic.
1163
+ */
1164
+
1165
+ /*
1166
+ * Desktop-up mixin:
1167
+ * 1) Enable desktop enhancement in wider containers
1168
+ * 2) Keep viewport media query as fallback
1169
+ */
1170
+
1115
1171
  /* ============================================================================
1116
1172
  主容器
1117
1173
  ============================================================================ */
1118
1174
 
1119
1175
  .taskon-quest-rewards {
1176
+ container-type: inline-size;
1120
1177
  overflow: hidden;
1121
- border-radius: 10px;
1178
+ border-radius: var(--taskon-border-radius-lg);
1122
1179
  background: var(--taskon-color-bg-surface-subtle);
1123
1180
  }
1124
1181
 
@@ -1164,7 +1221,7 @@
1164
1221
 
1165
1222
  .taskon-quest-rewards-ranking-point {
1166
1223
  padding: 16px;
1167
- border-radius: 10px;
1224
+ border-radius: var(--taskon-border-radius-lg);
1168
1225
  border: 1px solid var(--taskon-color-border-secondary);
1169
1226
  background: var(--taskon-color-bg-surface-subtle);
1170
1227
  }
@@ -1188,6 +1245,7 @@
1188
1245
  }
1189
1246
 
1190
1247
  /* Tip icon margin (controlled externally as TipPopover has no internal margin) */
1248
+
1191
1249
  .taskon-quest-rewards-ranking-point-tip-icon {
1192
1250
  margin-left: 6px;
1193
1251
  }
@@ -1272,7 +1330,7 @@
1272
1330
  .taskon-quest-rewards-card {
1273
1331
  margin-top: 12px;
1274
1332
  background: var(--taskon-color-bg-surface-subtle);
1275
- border-radius: 8px;
1333
+ border-radius: var(--taskon-border-radius);
1276
1334
  overflow: hidden;
1277
1335
  }
1278
1336
 
@@ -1285,6 +1343,7 @@
1285
1343
  }
1286
1344
 
1287
1345
  /* Tier 表头(仅 PointRanking 模式) */
1346
+
1288
1347
  .taskon-quest-rewards-card-tier {
1289
1348
  display: flex;
1290
1349
  align-items: center;
@@ -1322,6 +1381,7 @@
1322
1381
  }
1323
1382
 
1324
1383
  /* 卡片主体 */
1384
+
1325
1385
  .taskon-quest-rewards-card-body {
1326
1386
  padding: 20px;
1327
1387
  display: flex;
@@ -1401,11 +1461,12 @@
1401
1461
  }
1402
1462
 
1403
1463
  /* Chain Icon Tooltip */
1464
+
1404
1465
  .taskon-quest-rewards-chain-tooltip {
1405
1466
  padding: 6px 10px;
1406
1467
  background: var(--taskon-color-bg-floating);
1407
1468
  border: 1px solid var(--taskon-color-border);
1408
- border-radius: 6px;
1469
+ border-radius: var(--taskon-border-radius-sm);
1409
1470
  box-shadow: 0 4px 12px var(--taskon-color-bg-mask);
1410
1471
  font-size: 12px;
1411
1472
  line-height: 16px;
@@ -1474,7 +1535,7 @@
1474
1535
  line-height: 14px;
1475
1536
  padding: 2px 6px;
1476
1537
  background: var(--taskon-color-secondary-bg);
1477
- border-radius: 4px;
1538
+ border-radius: var(--taskon-border-radius-sm);
1478
1539
  color: var(--taskon-color-text-secondary);
1479
1540
  }
1480
1541
 
@@ -1499,6 +1560,7 @@
1499
1560
  }
1500
1561
 
1501
1562
  /* BRC20 标签 */
1563
+
1502
1564
  .taskon-quest-rewards-token-brc20 {
1503
1565
  padding: 2px 6px;
1504
1566
  font-size: 12px;
@@ -1506,7 +1568,7 @@
1506
1568
  font-weight: 500;
1507
1569
  color: var(--taskon-color-warning);
1508
1570
  background: var(--taskon-color-warning-bg);
1509
- border-radius: 4px;
1571
+ border-radius: var(--taskon-border-radius-sm);
1510
1572
  }
1511
1573
 
1512
1574
  /* ============================================================================
@@ -1551,7 +1613,7 @@
1551
1613
  padding: 12px 16px;
1552
1614
  background: var(--taskon-color-bg-floating);
1553
1615
  border: 1px solid var(--taskon-color-border);
1554
- border-radius: 8px;
1616
+ border-radius: var(--taskon-border-radius);
1555
1617
  box-shadow: 0 4px 12px var(--taskon-color-bg-mask);
1556
1618
  max-width: 300px;
1557
1619
  z-index: 1000;
@@ -1732,8 +1794,9 @@
1732
1794
 
1733
1795
  .taskon-quest-rewards-gas {
1734
1796
  display: flex;
1735
- align-items: center;
1736
- gap: 12px;
1797
+ flex-direction: column;
1798
+ align-items: flex-start;
1799
+ gap: 8px;
1737
1800
  margin-top: 8px;
1738
1801
  }
1739
1802
 
@@ -1746,14 +1809,44 @@
1746
1809
 
1747
1810
  .taskon-quest-rewards-gas-bar {
1748
1811
  flex: 1;
1812
+ width: 100%;
1749
1813
  position: relative;
1750
1814
  height: 8px;
1751
1815
  background: var(--taskon-color-bg-surface-strong);
1752
- border-radius: 2px;
1816
+ border-radius: var(--taskon-border-radius-sm);
1753
1817
  overflow: hidden;
1754
1818
  }
1755
1819
 
1820
+ @supports (container-type: inline-size) {
1821
+ @container (min-width: 751px) {
1822
+ .taskon-quest-rewards-gas {
1823
+ flex-direction: row;
1824
+ align-items: center;
1825
+ gap: 12px;
1826
+ }
1827
+
1828
+ .taskon-quest-rewards-gas-bar {
1829
+ width: auto;
1830
+ }
1831
+ }
1832
+ }
1833
+
1834
+ @supports not (container-type: inline-size) {
1835
+ @media (min-width: 751px) {
1836
+ .taskon-quest-rewards-gas {
1837
+ flex-direction: row;
1838
+ align-items: center;
1839
+ gap: 12px;
1840
+ }
1841
+
1842
+ .taskon-quest-rewards-gas-bar {
1843
+ width: auto;
1844
+ }
1845
+ }
1846
+ }
1847
+
1756
1848
  /* 进度条靠右对齐(显示剩余量) */
1849
+
1757
1850
  .taskon-quest-rewards-gas-progress {
1758
1851
  position: absolute;
1759
1852
  right: 0;
@@ -1767,11 +1860,12 @@
1767
1860
  var(--taskon-color-secondary) -229.89%,
1768
1861
  var(--taskon-color-primary) 100%
1769
1862
  );
1770
- border-radius: 2px;
1863
+ border-radius: var(--taskon-border-radius-sm);
1771
1864
  overflow: hidden;
1772
1865
  }
1773
1866
 
1774
1867
  /* 波浪纹条纹 */
1868
+
1775
1869
  .taskon-quest-rewards-gas-wave {
1776
1870
  width: 3px;
1777
1871
  flex-shrink: 0;
@@ -1788,14 +1882,14 @@
1788
1882
  width: 100%;
1789
1883
  padding: 26px;
1790
1884
  border: 1px solid var(--taskon-color-border);
1791
- border-radius: 8px;
1885
+ border-radius: var(--taskon-border-radius);
1792
1886
  box-sizing: border-box;
1793
1887
  }
1794
1888
 
1795
1889
  .taskon-quest-rewards-preview-image,
1796
1890
  .taskon-quest-rewards-preview-video {
1797
1891
  width: 100%;
1798
- border-radius: 8px;
1892
+ border-radius: var(--taskon-border-radius);
1799
1893
  display: block;
1800
1894
  }
1801
1895
 
@@ -1807,7 +1901,7 @@
1807
1901
  position: relative;
1808
1902
  padding: 16px;
1809
1903
  background: transparent;
1810
- border-radius: 8px;
1904
+ border-radius: var(--taskon-border-radius);
1811
1905
  border: 1px solid var(--taskon-color-secondary-bg);
1812
1906
  overflow: hidden;
1813
1907
  }
@@ -1876,6 +1970,7 @@
1876
1970
  }
1877
1971
 
1878
1972
  /* 未完成遮罩层 */
1973
+
1879
1974
  .taskon-quest-rewards-estimated-mask {
1880
1975
  position: absolute;
1881
1976
  inset: 0;
@@ -1884,7 +1979,7 @@
1884
1979
  align-items: center;
1885
1980
  justify-content: center;
1886
1981
  background: var(--taskon-color-bg-mask);
1887
- border-radius: 8px;
1982
+ border-radius: var(--taskon-border-radius);
1888
1983
  backdrop-filter: blur(4px);
1889
1984
  padding: 16px;
1890
1985
  }
@@ -1932,11 +2027,12 @@
1932
2027
  display: flex;
1933
2028
  flex-direction: column;
1934
2029
  gap: 24px;
1935
- border-radius: 10px;
2030
+ border-radius: var(--taskon-border-radius-lg);
1936
2031
  background: var(--taskon-color-bg-surface-subtle);
1937
2032
  }
1938
2033
 
1939
2034
  /* 覆盖 BaseRow 的 label 样式,匹配 Vue 版本 */
2035
+
1940
2036
  .taskon-quest-rewards-bonus-card .taskon-quest-rewards-row-label {
1941
2037
  color: var(--taskon-color-text-secondary);
1942
2038
  font-size: 16px;
@@ -1969,163 +2065,6 @@
1969
2065
  font-weight: 400;
1970
2066
  }
1971
2067
 
1972
- /* ============================================================================
1973
- 移动端响应式
1974
- ============================================================================ */
1975
-
1976
- @media (max-width: 750px) {
1977
- .taskon-quest-rewards {
1978
- margin-top: 4vw;
1979
- }
1980
-
1981
- .taskon-quest-rewards-container {
1982
- padding: 4vw;
1983
- gap: 7.2vw;
1984
- }
1985
-
1986
- /* 用户信息移动端样式 */
1987
- .taskon-quest-rewards-user-avatar {
1988
- margin-right: 2.933vw;
1989
- width: 10.667vw;
1990
- height: 10.667vw;
1991
- }
1992
-
1993
- .taskon-quest-rewards-user-name {
1994
- font-size: 4.8vw;
1995
- line-height: 6vw;
1996
- }
1997
-
1998
- /* 排名积分移动端样式 */
1999
- .taskon-quest-rewards-ranking-point {
2000
- padding: 3.467vw 4vw;
2001
- }
2002
-
2003
- .taskon-quest-rewards-ranking-point-label {
2004
- font-size: 3.733vw;
2005
- line-height: 4.667vw;
2006
- }
2007
-
2008
- .taskon-quest-rewards-ranking-point-number,
2009
- .taskon-quest-rewards-ranking-point-amount {
2010
- font-size: 4.533vw;
2011
- line-height: 5.733vw;
2012
- }
2013
-
2014
- .taskon-quest-rewards-ranking-point-row--points {
2015
- margin-top: 6.4vw;
2016
- }
2017
-
2018
- .taskon-quest-rewards-ranking-point-tier {
2019
- font-size: 2.933vw;
2020
- line-height: 3.733vw;
2021
- }
2022
-
2023
- .taskon-quest-rewards-card {
2024
- margin-top: 1.6vw;
2025
- }
2026
-
2027
- .taskon-quest-rewards-card-tier {
2028
- gap: 0.8vw;
2029
- padding: 0.8vw 1.333vw;
2030
- font-size: 3.467vw;
2031
- line-height: 4.4vw;
2032
- }
2033
-
2034
- .taskon-quest-rewards-card-body {
2035
- padding: 1.6vw;
2036
- gap: 2.133vw;
2037
- }
2038
-
2039
- .taskon-quest-rewards-row-label {
2040
- font-size: 3.867vw;
2041
- line-height: 4.8vw;
2042
- }
2043
-
2044
- .taskon-quest-rewards-token-amount,
2045
- .taskon-quest-rewards-token-name,
2046
- .taskon-quest-rewards-nft-name,
2047
- .taskon-quest-rewards-minted-nft-name,
2048
- .taskon-quest-rewards-cap-name,
2049
- .taskon-quest-rewards-whitelist-name,
2050
- .taskon-quest-rewards-points-amount,
2051
- .taskon-quest-rewards-points-name,
2052
- .taskon-quest-rewards-exp-amount,
2053
- .taskon-quest-rewards-exp-label,
2054
- .taskon-quest-rewards-discord-role-name,
2055
- .taskon-quest-rewards-winner-count,
2056
- .taskon-quest-rewards-winner-ranking,
2057
- .taskon-quest-rewards-winner-open {
2058
- font-size: 4.267vw;
2059
- line-height: 5.333vw;
2060
- }
2061
-
2062
- .taskon-quest-rewards-preview {
2063
- padding: 6.267vw;
2064
- }
2065
-
2066
- /* Bonus 模块移动端样式 */
2067
- .taskon-quest-rewards-bonus-card {
2068
- margin-top: 2.667vw;
2069
- padding: 4vw;
2070
- gap: 5.333vw;
2071
- }
2072
-
2073
- .taskon-quest-rewards-bonus-card .taskon-quest-rewards-row-label {
2074
- font-size: 3.467vw;
2075
- line-height: 4.4vw;
2076
- }
2077
-
2078
- .taskon-quest-rewards-bonus-desc {
2079
- font-size: 3.2vw;
2080
- line-height: 4vw;
2081
- }
2082
-
2083
- .taskon-quest-rewards-bonus-value {
2084
- font-size: 3.733vw;
2085
- line-height: 4vw;
2086
- }
2087
-
2088
- .taskon-quest-rewards-bonus-amount {
2089
- margin-right: 0.8vw;
2090
- }
2091
-
2092
- .taskon-quest-rewards-bonus-unit {
2093
- font-size: 3.2vw;
2094
- }
2095
-
2096
- /* View Leaderboard 按钮移动端样式 */
2097
- .taskon-quest-rewards-view-leaderboard {
2098
- font-size: 3.2vw;
2099
- line-height: 4vw;
2100
- }
2101
-
2102
- .taskon-quest-rewards-view-leaderboard-arrow {
2103
- margin-left: 1.867vw;
2104
- }
2105
-
2106
- /* Gas Station 移动端样式 */
2107
- .taskon-quest-rewards-gas {
2108
- flex-direction: column;
2109
- align-items: flex-start;
2110
- gap: 2vw;
2111
- }
2112
-
2113
- .taskon-quest-rewards-gas-label {
2114
- font-size: 3.2vw;
2115
- line-height: 4vw;
2116
- }
2117
-
2118
- .taskon-quest-rewards-gas-bar {
2119
- width: 100%;
2120
- height: 1.6vw;
2121
- }
2122
-
2123
- .taskon-quest-rewards-gas-wave {
2124
- width: 0.6vw;
2125
- gap: 1.2vw;
2126
- }
2127
- }
2128
-
2129
2068
  /* ============================================================================
2130
2069
  View Leaderboard 按钮(链接样式,与原版一致)
2131
2070
  ============================================================================ */
@@ -2273,6 +2212,7 @@
2273
2212
  }
2274
2213
 
2275
2214
  /* 排名徽章 */
2215
+
2276
2216
  .taskon-quest-leaderboard-rank {
2277
2217
  display: inline-flex;
2278
2218
  align-items: center;
@@ -2282,6 +2222,7 @@
2282
2222
  }
2283
2223
 
2284
2224
  /* Unranked / N/A 状态 */
2225
+
2285
2226
  .taskon-quest-leaderboard-rank--unranked {
2286
2227
  font-size: 14px;
2287
2228
  font-weight: 500;
@@ -2289,6 +2230,7 @@
2289
2230
  }
2290
2231
 
2291
2232
  /* 表头带提示框的容器 */
2233
+
2292
2234
  .taskon-quest-leaderboard-header {
2293
2235
  display: inline-flex;
2294
2236
  align-items: center;
@@ -2296,6 +2238,7 @@
2296
2238
  }
2297
2239
 
2298
2240
  /* 层级列 */
2241
+
2299
2242
  .taskon-quest-leaderboard-tier {
2300
2243
  font-size: 14px;
2301
2244
  font-weight: 500;
@@ -2303,6 +2246,7 @@
2303
2246
  }
2304
2247
 
2305
2248
  /* 用户单元格 */
2249
+
2306
2250
  .taskon-quest-leaderboard-user {
2307
2251
  display: flex;
2308
2252
  align-items: center;
@@ -2318,7 +2262,7 @@
2318
2262
  font-weight: 600;
2319
2263
  color: var(--taskon-color-text-on-primary);
2320
2264
  background: var(--taskon-color-secondary);
2321
- border-radius: 4px;
2265
+ border-radius: var(--taskon-border-radius-sm);
2322
2266
  }
2323
2267
 
2324
2268
  .taskon-quest-leaderboard-user-name {
@@ -2330,6 +2274,7 @@
2330
2274
  }
2331
2275
 
2332
2276
  /* 积分 */
2277
+
2333
2278
  .taskon-quest-leaderboard-points {
2334
2279
  font-size: 14px;
2335
2280
  font-weight: 500;
@@ -2337,6 +2282,7 @@
2337
2282
  }
2338
2283
 
2339
2284
  /* 奖励 */
2285
+
2340
2286
  .taskon-quest-leaderboard-reward-cell {
2341
2287
  display: inline-flex;
2342
2288
  align-items: center;
@@ -2371,26 +2317,51 @@
2371
2317
  * Following Widget naming convention: .taskon-quest-footer-*
2372
2318
  */
2373
2319
 
2320
+ /*
2321
+ * Responsive base styles
2322
+ *
2323
+ * Keep mobile breakpoints and fallback patterns centralized here.
2324
+ * Components should reuse these mixins instead of duplicating query logic.
2325
+ */
2326
+
2327
+ /*
2328
+ * Desktop-up mixin:
2329
+ * 1) Enable desktop enhancement in wider containers
2330
+ * 2) Keep viewport media query as fallback
2331
+ */
2332
+
2374
2333
  /* ============================================================================
2375
2334
  Main Container
2376
2335
  ============================================================================ */
2377
2336
 
2378
2337
  .taskon-quest-footer {
2379
- margin-top: 20px;
2338
+ container-type: inline-size;
2339
+ margin-top: 0;
2380
2340
  position: relative;
2381
2341
  }
2382
2342
 
2383
- @media (max-width: 750px) {
2343
+ @supports (container-type: inline-size) {
2344
+ @container (min-width: 751px) {
2384
2345
  .taskon-quest-footer {
2385
- margin-top: 0;
2346
+ margin-top: 20px;
2347
+ }
2348
+ }
2349
+ }
2350
+
2351
+ @supports not (container-type: inline-size) {
2352
+ @media (min-width: 751px) {
2353
+ .taskon-quest-footer {
2354
+ margin-top: 20px;
2355
+ }
2356
+ }
2386
2357
  }
2387
- }
2388
2358
 
2389
2359
  /* ============================================================================
2390
2360
  Status Card - New Design (v2)
2391
2361
  ============================================================================ */
2392
2362
 
2393
2363
  /* Container for the entire status section */
2364
+
2394
2365
  .taskon-quest-footer-status {
2395
2366
  display: flex;
2396
2367
  flex-direction: column;
@@ -2398,6 +2369,7 @@
2398
2369
  }
2399
2370
 
2400
2371
  /* Title row: title + badge */
2372
+
2401
2373
  .taskon-quest-footer-title-row {
2402
2374
  display: flex;
2403
2375
  align-items: center;
@@ -2405,13 +2377,14 @@
2405
2377
  }
2406
2378
 
2407
2379
  /* Badge styles */
2380
+
2408
2381
  .taskon-quest-footer-badge {
2409
2382
  display: inline-flex;
2410
2383
  align-items: center;
2411
2384
  justify-content: center;
2412
2385
  height: 20px;
2413
2386
  padding: 0 8px;
2414
- border-radius: 12px;
2387
+ border-radius: var(--taskon-border-radius-lg);
2415
2388
  font-size: 12px;
2416
2389
  font-weight: 600;
2417
2390
  line-height: 16px;
@@ -2430,25 +2403,19 @@
2430
2403
  }
2431
2404
 
2432
2405
  /* Dark content card */
2406
+
2433
2407
  .taskon-quest-footer-card {
2434
2408
  display: flex;
2435
- gap: 12px;
2436
- align-items: center;
2409
+ flex-direction: column;
2410
+ gap: 8px;
2411
+ align-items: stretch;
2437
2412
  padding: 12px;
2438
- border-radius: 8px;
2413
+ border-radius: var(--taskon-border-radius);
2439
2414
  background: var(--taskon-color-bg-surface-strong);
2440
2415
  }
2441
2416
 
2442
- @media (max-width: 750px) {
2443
- .taskon-quest-footer-card {
2444
- flex-direction: column;
2445
- align-items: stretch;
2446
- gap: 8px;
2447
- padding: 3.2vw;
2448
- }
2449
- }
2450
-
2451
2417
  /* Card message text (for simple messages) */
2418
+
2452
2419
  .taskon-quest-footer-card-message {
2453
2420
  font-size: 16px;
2454
2421
  font-weight: 600;
@@ -2461,6 +2428,7 @@
2461
2428
  ============================================================================ */
2462
2429
 
2463
2430
  /* Card content area */
2431
+
2464
2432
  .taskon-quest-footer-card-content {
2465
2433
  display: flex;
2466
2434
  flex-direction: column;
@@ -2478,13 +2446,6 @@
2478
2446
  color: var(--taskon-color-text);
2479
2447
  }
2480
2448
 
2481
- @media (max-width: 750px) {
2482
- .taskon-quest-footer-title {
2483
- font-size: 4.267vw;
2484
- line-height: 5.867vw;
2485
- }
2486
- }
2487
-
2488
2449
  .taskon-quest-footer-desc {
2489
2450
  margin-top: 2px;
2490
2451
  font-size: 14px;
@@ -2493,14 +2454,6 @@
2493
2454
  color: var(--taskon-color-text-tertiary);
2494
2455
  }
2495
2456
 
2496
- @media (max-width: 750px) {
2497
- .taskon-quest-footer-desc {
2498
- margin-top: 0.533vw;
2499
- font-size: 3.2vw;
2500
- line-height: 3.733vw;
2501
- }
2502
- }
2503
-
2504
2457
  /* ============================================================================
2505
2458
  Connect Wallet
2506
2459
  ============================================================================ */
@@ -2518,7 +2471,7 @@
2518
2471
  color: var(--taskon-color-text-on-primary);
2519
2472
  background-color: var(--taskon-color-primary);
2520
2473
  border: none;
2521
- border-radius: 8px;
2474
+ border-radius: var(--taskon-border-radius);
2522
2475
  cursor: pointer;
2523
2476
  transition: background-color 0.2s ease;
2524
2477
  }
@@ -2539,7 +2492,7 @@
2539
2492
  color: var(--taskon-color-text-on-primary);
2540
2493
  background-color: var(--taskon-color-primary);
2541
2494
  border: none;
2542
- border-radius: 8px;
2495
+ border-radius: var(--taskon-border-radius);
2543
2496
  cursor: pointer;
2544
2497
  transition: background-color 0.2s ease, opacity 0.2s ease;
2545
2498
  }
@@ -2553,14 +2506,8 @@
2553
2506
  cursor: not-allowed;
2554
2507
  }
2555
2508
 
2556
- @media (max-width: 750px) {
2557
- .taskon-quest-footer-complete-btn {
2558
- height: 13.33vw;
2559
- font-weight: bold;
2560
- }
2561
- }
2562
-
2563
2509
  /* Complete Button Loading State */
2510
+
2564
2511
  .taskon-quest-footer-complete-btn--loading {
2565
2512
  pointer-events: none;
2566
2513
  }
@@ -2605,13 +2552,6 @@
2605
2552
  color: var(--taskon-color-text-tertiary);
2606
2553
  }
2607
2554
 
2608
- @media (max-width: 750px) {
2609
- .taskon-quest-footer-earned-placeholder {
2610
- margin-top: 2vw;
2611
- gap: 2.267vw;
2612
- }
2613
- }
2614
-
2615
2555
  /* ============================================================================
2616
2556
  Earned Rewards - New Design (v2)
2617
2557
  ============================================================================ */
@@ -2624,12 +2564,6 @@
2624
2564
  margin-top: 0;
2625
2565
  }
2626
2566
 
2627
- @media (max-width: 750px) {
2628
- .taskon-quest-footer-earned {
2629
- gap: 0;
2630
- }
2631
- }
2632
-
2633
2567
  .taskon-quest-footer-earned-list {
2634
2568
  display: flex;
2635
2569
  flex-direction: column;
@@ -2637,12 +2571,13 @@
2637
2571
  }
2638
2572
 
2639
2573
  /* Single reward inner card */
2574
+
2640
2575
  .taskon-quest-footer-earned-single {
2641
2576
  display: flex;
2642
2577
  flex-direction: column;
2643
2578
  gap: 0;
2644
2579
  padding: 8px;
2645
- border-radius: 8px;
2580
+ border-radius: var(--taskon-border-radius);
2646
2581
  border: 1px solid var(--taskon-color-border-secondary);
2647
2582
  background: var(--taskon-color-bg-surface-strong);
2648
2583
  }
@@ -2682,6 +2617,7 @@
2682
2617
  }
2683
2618
 
2684
2619
  /* Multi reward row */
2620
+
2685
2621
  .taskon-quest-footer-earned-multi {
2686
2622
  display: flex;
2687
2623
  align-items: center;
@@ -2696,6 +2632,7 @@
2696
2632
  }
2697
2633
 
2698
2634
  /* Redirect mode row (same layout as multi) */
2635
+
2699
2636
  .taskon-quest-footer-earned-redirect {
2700
2637
  display: flex;
2701
2638
  align-items: center;
@@ -2711,32 +2648,22 @@
2711
2648
  }
2712
2649
 
2713
2650
  /* Hide first reward on mobile when has multiple rewards */
2714
- @media (max-width: 750px) {
2715
- .taskon-quest-footer-earned-first--hide-mobile {
2716
- display: none;
2717
- }
2651
+
2652
+ .taskon-quest-footer-earned-first--hide-mobile {
2653
+ display: none;
2718
2654
  }
2719
2655
 
2720
2656
  .taskon-quest-footer-earned-more {
2721
2657
  display: flex;
2722
- flex-direction: column;
2723
- justify-content: center;
2724
- align-items: flex-start;
2658
+ flex-direction: row;
2659
+ justify-content: flex-start;
2660
+ align-items: center;
2725
2661
  flex: 1;
2726
- gap: 4px;
2662
+ gap: 12px;
2727
2663
  overflow: hidden;
2728
- border-radius: 4px;
2664
+ border-radius: var(--taskon-border-radius-sm);
2729
2665
  background-color: var(--taskon-color-bg-inset);
2730
- padding: 4px 8px;
2731
- }
2732
-
2733
- @media (max-width: 750px) {
2734
- .taskon-quest-footer-earned-more {
2735
- flex-direction: row;
2736
- align-items: center;
2737
- gap: 3vw;
2738
- padding: 2vw;
2739
- }
2666
+ padding: 8px;
2740
2667
  }
2741
2668
 
2742
2669
  /* ============================================================================
@@ -2748,17 +2675,11 @@
2748
2675
  flex-direction: column;
2749
2676
  justify-content: center;
2750
2677
  flex: 1;
2751
- border-radius: 4px;
2678
+ border-radius: var(--taskon-border-radius-sm);
2752
2679
  background-color: var(--taskon-color-bg-inset);
2753
2680
  padding: 4px 8px;
2754
2681
  }
2755
2682
 
2756
- @media (max-width: 750px) {
2757
- .taskon-quest-footer-reward {
2758
- padding: 2vw;
2759
- }
2760
- }
2761
-
2762
2683
  /* ============================================================================
2763
2684
  Base Info (for future implementation)
2764
2685
  ============================================================================ */
@@ -2770,12 +2691,6 @@
2770
2691
  font-size: 18px;
2771
2692
  }
2772
2693
 
2773
- @media (max-width: 750px) {
2774
- .taskon-quest-footer-reward-info {
2775
- gap: 2vw;
2776
- }
2777
- }
2778
-
2779
2694
  .taskon-quest-footer-reward-info img {
2780
2695
  height: 20px;
2781
2696
  width: 20px;
@@ -2783,13 +2698,6 @@
2783
2698
  object-fit: cover;
2784
2699
  }
2785
2700
 
2786
- @media (max-width: 750px) {
2787
- .taskon-quest-footer-reward-info img {
2788
- height: 8vw;
2789
- width: 8vw;
2790
- }
2791
- }
2792
-
2793
2701
  .taskon-quest-footer-reward-amount {
2794
2702
  color: var(--taskon-color-primary);
2795
2703
  }
@@ -2835,7 +2743,7 @@
2835
2743
  color: var(--taskon-color-text-on-primary);
2836
2744
  background-color: var(--taskon-color-primary);
2837
2745
  border: none;
2838
- border-radius: 4px;
2746
+ border-radius: var(--taskon-border-radius-sm);
2839
2747
  cursor: pointer;
2840
2748
  transition: background-color 0.2s ease, opacity 0.2s ease;
2841
2749
  }
@@ -2901,7 +2809,7 @@
2901
2809
  font-weight: 500;
2902
2810
  color: var(--taskon-color-text-on-primary);
2903
2811
  background-color: var(--taskon-color-primary);
2904
- border-radius: 2px;
2812
+ border-radius: var(--taskon-border-radius-sm);
2905
2813
  }
2906
2814
 
2907
2815
  .taskon-quest-footer-reward-badge-icon {
@@ -2911,14 +2819,6 @@
2911
2819
  object-fit: cover;
2912
2820
  }
2913
2821
 
2914
- @media (max-width: 750px) {
2915
- .taskon-quest-footer-reward-badge-icon {
2916
- margin-left: 1.067vw;
2917
- width: 3.2vw;
2918
- height: 3.2vw;
2919
- }
2920
- }
2921
-
2922
2822
  .taskon-quest-footer-reward-badge-line {
2923
2823
  margin-left: 4px;
2924
2824
  width: 1px;
@@ -2927,13 +2827,6 @@
2927
2827
  background: var(--taskon-color-border-secondary);
2928
2828
  }
2929
2829
 
2930
- @media (max-width: 750px) {
2931
- .taskon-quest-footer-reward-badge-line {
2932
- margin-left: 0.8vw;
2933
- height: 2.267vw;
2934
- }
2935
- }
2936
-
2937
2830
  /* ============================================================================
2938
2831
  Reward - Tx Hash
2939
2832
  ============================================================================ */
@@ -2979,13 +2872,6 @@
2979
2872
  object-fit: cover;
2980
2873
  }
2981
2874
 
2982
- @media (max-width: 750px) {
2983
- .taskon-quest-footer-reward-chain-icon {
2984
- width: 8vw;
2985
- height: 8vw;
2986
- }
2987
- }
2988
-
2989
2875
  /* ============================================================================
2990
2876
  Detail Panel Dialog
2991
2877
  ============================================================================ */
@@ -3005,25 +2891,12 @@
3005
2891
  margin: 0 0 20px 0;
3006
2892
  }
3007
2893
 
3008
- @media (max-width: 750px) {
3009
- .taskon-quest-footer-detail-title {
3010
- font-size: 4.8vw;
3011
- margin-bottom: 4vw;
3012
- }
3013
- }
3014
-
3015
2894
  .taskon-quest-footer-detail-content {
3016
2895
  display: flex;
3017
2896
  flex-direction: column;
3018
2897
  gap: 24px;
3019
2898
  }
3020
2899
 
3021
- @media (max-width: 750px) {
3022
- .taskon-quest-footer-detail-content {
3023
- gap: 5vw;
3024
- }
3025
- }
3026
-
3027
2900
  /* ============================================================================
3028
2901
  Selection Item
3029
2902
  ============================================================================ */
@@ -3036,12 +2909,6 @@
3036
2909
  margin-top: 24px;
3037
2910
  }
3038
2911
 
3039
- @media (max-width: 750px) {
3040
- .taskon-quest-footer-selection-item + .taskon-quest-footer-selection-item {
3041
- margin-top: 5vw;
3042
- }
3043
- }
3044
-
3045
2912
  .taskon-quest-footer-selection-label {
3046
2913
  font-size: 16px;
3047
2914
  font-weight: 500;
@@ -3055,19 +2922,14 @@
3055
2922
  gap: 24px;
3056
2923
  }
3057
2924
 
3058
- @media (max-width: 750px) {
3059
- .taskon-quest-footer-selection-rewards {
3060
- margin-top: 2vw;
3061
- gap: 5vw;
3062
- }
3063
- }
3064
-
3065
2925
  /* Selection Item - Transparent reward card background */
2926
+
3066
2927
  .taskon-quest-footer-selection-rewards .taskon-quest-footer-reward {
3067
2928
  background: transparent;
3068
2929
  }
3069
2930
 
3070
2931
  /* Selection Failed */
2932
+
3071
2933
  .taskon-quest-footer-selection-failed {
3072
2934
  display: flex;
3073
2935
  align-items: center;
@@ -3083,6 +2945,7 @@
3083
2945
  }
3084
2946
 
3085
2947
  /* Selection Wait */
2948
+
3086
2949
  .taskon-quest-footer-selection-wait {
3087
2950
  display: flex;
3088
2951
  align-items: center;
@@ -3103,19 +2966,67 @@
3103
2966
  ============================================================================ */
3104
2967
 
3105
2968
  .taskon-quest-footer-detail-bonus {
3106
- margin-top: 24px;
3107
- padding-top: 24px;
2969
+ margin-top: 20px;
2970
+ padding-top: 0;
3108
2971
  display: flex;
3109
- border-top: 1px solid var(--taskon-color-border-secondary);
2972
+ border-top: none;
3110
2973
  }
3111
2974
 
3112
- @media (max-width: 750px) {
2975
+ @supports (container-type: inline-size) {
2976
+ @container (min-width: 751px) {
2977
+ .taskon-quest-footer-card {
2978
+ flex-direction: row;
2979
+ align-items: center;
2980
+ gap: 12px;
2981
+ }
2982
+
2983
+ .taskon-quest-footer-earned-first--hide-mobile {
2984
+ display: flex;
2985
+ }
2986
+
2987
+ .taskon-quest-footer-earned-more {
2988
+ flex-direction: column;
2989
+ justify-content: center;
2990
+ align-items: flex-start;
2991
+ gap: 4px;
2992
+ padding: 4px 8px;
2993
+ }
2994
+
3113
2995
  .taskon-quest-footer-detail-bonus {
3114
- margin-top: 5vw;
3115
- padding-top: 0;
3116
- border-top: none;
2996
+ margin-top: 24px;
2997
+ padding-top: 24px;
2998
+ border-top: 1px solid var(--taskon-color-border-secondary);
2999
+ }
3000
+ }
3001
+ }
3002
+
3003
+ @supports not (container-type: inline-size) {
3004
+ @media (min-width: 751px) {
3005
+ .taskon-quest-footer-card {
3006
+ flex-direction: row;
3007
+ align-items: center;
3008
+ gap: 12px;
3009
+ }
3010
+
3011
+ .taskon-quest-footer-earned-first--hide-mobile {
3012
+ display: flex;
3013
+ }
3014
+
3015
+ .taskon-quest-footer-earned-more {
3016
+ flex-direction: column;
3017
+ justify-content: center;
3018
+ align-items: flex-start;
3019
+ gap: 4px;
3020
+ padding: 4px 8px;
3021
+ }
3022
+
3023
+ .taskon-quest-footer-detail-bonus {
3024
+ margin-top: 24px;
3025
+ padding-top: 24px;
3026
+ border-top: 1px solid var(--taskon-color-border-secondary);
3027
+ }
3028
+ }
3117
3029
  }
3118
- }
3119
3030
 
3120
3031
  .taskon-quest-footer-detail-bonus-label {
3121
3032
  font-size: 16px;
@@ -3139,12 +3050,6 @@
3139
3050
  margin-top: 8px;
3140
3051
  }
3141
3052
 
3142
- @media (max-width: 750px) {
3143
- .taskon-quest-footer-detail-bonus-item + .taskon-quest-footer-detail-bonus-item {
3144
- margin-top: 2vw;
3145
- }
3146
- }
3147
-
3148
3053
  /* ============================================================================
3149
3054
  Action Button - Arrow icon
3150
3055
  ============================================================================ */
@@ -3155,6 +3060,7 @@
3155
3060
  }
3156
3061
 
3157
3062
  /* Link style for ActionButton */
3063
+
3158
3064
  a.taskon-quest-footer-action-btn {
3159
3065
  text-decoration: none;
3160
3066
  }
@@ -3202,7 +3108,7 @@ a.taskon-quest-footer-action-btn {
3202
3108
  max-width: 200px;
3203
3109
  padding: 12px 24px;
3204
3110
  border: none;
3205
- border-radius: 8px;
3111
+ border-radius: var(--taskon-border-radius);
3206
3112
  background: var(--taskon-color-primary);
3207
3113
  color: var(--taskon-color-text-on-primary);
3208
3114
  font-size: 16px;
@@ -3247,7 +3153,7 @@ a.taskon-quest-footer-action-btn {
3247
3153
  justify-content: space-between;
3248
3154
  padding: 12px 16px;
3249
3155
  background: var(--taskon-color-bg-surface-strong);
3250
- border-radius: 8px;
3156
+ border-radius: var(--taskon-border-radius);
3251
3157
  border: 1px solid var(--taskon-color-border);
3252
3158
  }
3253
3159
 
@@ -3276,7 +3182,7 @@ a.taskon-quest-footer-action-btn {
3276
3182
  gap: 6px;
3277
3183
  padding: 8px 16px;
3278
3184
  border: none;
3279
- border-radius: 6px;
3185
+ border-radius: var(--taskon-border-radius-sm);
3280
3186
  background: var(--taskon-color-primary);
3281
3187
  color: var(--taskon-color-text-on-primary);
3282
3188
  font-size: 13px;
@@ -3314,7 +3220,7 @@ a.taskon-quest-footer-action-btn {
3314
3220
  margin-top: 20px;
3315
3221
  padding: 14px 24px;
3316
3222
  border: 1px solid var(--taskon-color-border);
3317
- border-radius: 8px;
3223
+ border-radius: var(--taskon-border-radius);
3318
3224
  background: transparent;
3319
3225
  color: var(--taskon-color-text);
3320
3226
  font-size: 14px;
@@ -3367,7 +3273,7 @@ a.taskon-quest-footer-action-btn {
3367
3273
  .taskon-discord-bind-dialog-btn {
3368
3274
  width: 100%;
3369
3275
  padding: 14px 24px;
3370
- border-radius: 8px;
3276
+ border-radius: var(--taskon-border-radius);
3371
3277
  font-size: 14px;
3372
3278
  font-weight: 600;
3373
3279
  cursor: pointer;
@@ -3400,12 +3306,13 @@ a.taskon-quest-footer-action-btn {
3400
3306
  */
3401
3307
 
3402
3308
  /* WinnersRow 容器 - 使用主题背景层级 */
3309
+
3403
3310
  .taskon-quest-winners-row {
3404
3311
  display: flex;
3405
3312
  align-items: center;
3406
3313
  width: 100%;
3407
3314
  padding: 16px;
3408
- border-radius: 10px;
3315
+ border-radius: var(--taskon-border-radius-lg);
3409
3316
  border: none;
3410
3317
  cursor: pointer;
3411
3318
  background: var(--taskon-color-bg-surface-subtle);
@@ -3417,6 +3324,7 @@ a.taskon-quest-footer-action-btn {
3417
3324
  }
3418
3325
 
3419
3326
  /* Winners 标签 */
3327
+
3420
3328
  .taskon-quest-winners-row-label {
3421
3329
  font-size: 18px;
3422
3330
  font-weight: 500;
@@ -3425,6 +3333,7 @@ a.taskon-quest-footer-action-btn {
3425
3333
  }
3426
3334
 
3427
3335
  /* 数量 */
3336
+
3428
3337
  .taskon-quest-winners-row-count {
3429
3338
  flex: 1;
3430
3339
  margin-left: 8px;
@@ -3436,6 +3345,7 @@ a.taskon-quest-footer-action-btn {
3436
3345
  }
3437
3346
 
3438
3347
  /* 右箭头图标 */
3348
+
3439
3349
  .taskon-quest-winners-row-arrow {
3440
3350
  width: 16px;
3441
3351
  height: 16px;
@@ -3455,8 +3365,9 @@ a.taskon-quest-footer-action-btn {
3455
3365
  /* ==========================================================================
3456
3366
  Container - Match reward module style
3457
3367
  ========================================================================== */
3368
+
3458
3369
  .taskon-winners {
3459
- border-radius: 10px;
3370
+ border-radius: var(--taskon-border-radius-lg);
3460
3371
  background: var(--taskon-color-bg-surface-subtle);
3461
3372
  overflow: hidden;
3462
3373
  }
@@ -3464,6 +3375,7 @@ a.taskon-quest-footer-action-btn {
3464
3375
  /* ==========================================================================
3465
3376
  Status Alert (POW Reviewing / Drawing Winners)
3466
3377
  ========================================================================== */
3378
+
3467
3379
  .taskon-winners-alert {
3468
3380
  display: flex;
3469
3381
  align-items: center;
@@ -3506,6 +3418,7 @@ a.taskon-quest-footer-action-btn {
3506
3418
  /* ==========================================================================
3507
3419
  POW Review Info Card
3508
3420
  ========================================================================== */
3421
+
3509
3422
  .taskon-winners-content {
3510
3423
  padding: 16px;
3511
3424
  }
@@ -3530,9 +3443,10 @@ a.taskon-quest-footer-action-btn {
3530
3443
  /* ==========================================================================
3531
3444
  Status Info Card - Match reward module card style
3532
3445
  ========================================================================== */
3446
+
3533
3447
  .taskon-winners-card {
3534
3448
  padding: 16px;
3535
- border-radius: 8px;
3449
+ border-radius: var(--taskon-border-radius);
3536
3450
  background: var(--taskon-color-bg-surface-subtle);
3537
3451
  display: flex;
3538
3452
  flex-direction: column;
@@ -3566,6 +3480,7 @@ a.taskon-quest-footer-action-btn {
3566
3480
  ========================================================================== */
3567
3481
 
3568
3482
  /* Ensure winners row integrates well with status card */
3483
+
3569
3484
  .taskon-winners-card .taskon-quest-winners-row {
3570
3485
  padding: 0;
3571
3486
  background: transparent;
@@ -3576,11 +3491,25 @@ a.taskon-quest-footer-action-btn {
3576
3491
  * @design 参考 Figma 设计稿
3577
3492
  */
3578
3493
 
3494
+ /*
3495
+ * Responsive base styles
3496
+ *
3497
+ * Keep mobile breakpoints and fallback patterns centralized here.
3498
+ * Components should reuse these mixins instead of duplicating query logic.
3499
+ */
3500
+
3501
+ /*
3502
+ * Desktop-up mixin:
3503
+ * 1) Enable desktop enhancement in wider containers
3504
+ * 2) Keep viewport media query as fallback
3505
+ */
3506
+
3579
3507
  /* ============================================================================
3580
3508
  Quest Widget 根容器
3581
3509
  ============================================================================ */
3582
3510
 
3583
3511
  .taskon-quest {
3512
+ container-type: inline-size;
3584
3513
  font-size: 16px;
3585
3514
  line-height: 1.5;
3586
3515
  color: var(--taskon-color-text);
@@ -3591,27 +3520,140 @@ a.taskon-quest-footer-action-btn {
3591
3520
  ============================================================================ */
3592
3521
 
3593
3522
  .taskon-quest-loading {
3523
+ display: flex;
3524
+ width: 100%;
3525
+ }
3526
+
3527
+ .taskon-quest-skeleton-layout {
3528
+ width: 100%;
3529
+ }
3530
+
3531
+ .taskon-quest-skeleton-content,
3532
+ .taskon-quest-skeleton-sidebar {
3533
+ width: 100%;
3534
+ gap: var(--taskon-spacing-md);
3535
+ }
3536
+
3537
+ .taskon-quest-skeleton-group {
3538
+ width: 100%;
3594
3539
  display: flex;
3595
3540
  flex-direction: column;
3596
- align-items: center;
3597
- justify-content: center;
3598
- padding: 48px 24px;
3599
3541
  gap: 12px;
3600
- color: var(--taskon-color-text-tertiary);
3601
3542
  }
3602
3543
 
3603
- .taskon-quest-loading-spinner {
3604
- width: 32px;
3605
- height: 32px;
3606
- border: 3px solid var(--taskon-color-border);
3607
- border-top-color: var(--taskon-color-primary);
3608
- border-radius: 50%;
3609
- animation: taskon-quest-spin 1s linear infinite;
3544
+ .taskon-quest-skeleton-group--tasks {
3545
+ gap: 14px;
3546
+ }
3547
+
3548
+ .taskon-quest-skeleton-content-divider {
3549
+ margin: 8px 0;
3550
+ }
3551
+
3552
+ .taskon-quest-skeleton-block {
3553
+ position: relative;
3554
+ overflow: hidden;
3555
+ border-radius: var(--taskon-border-radius-lg);
3556
+ background: var(--taskon-color-bg-surface-subtle);
3557
+ }
3558
+
3559
+ .taskon-quest-skeleton-block::after {
3560
+ content: "";
3561
+ position: absolute;
3562
+ inset: 0;
3563
+ transform: translateX(-100%);
3564
+ background: linear-gradient(
3565
+ 90deg,
3566
+ transparent 0%,
3567
+ var(--taskon-color-bg-surface-strong) 50%,
3568
+ transparent 100%
3569
+ );
3570
+ animation: taskon-quest-skeleton-shimmer 1.4s ease-in-out infinite;
3571
+ }
3572
+
3573
+ .taskon-quest-skeleton-title {
3574
+ width: min(72%, 420px);
3575
+ height: 34px;
3576
+ }
3577
+
3578
+ .taskon-quest-skeleton-meta {
3579
+ width: min(44%, 280px);
3580
+ height: 20px;
3581
+ }
3582
+
3583
+ .taskon-quest-skeleton-banner {
3584
+ width: 100%;
3585
+ height: 168px;
3586
+ border-radius: var(--taskon-border-radius-lg);
3587
+ }
3588
+
3589
+ .taskon-quest-skeleton-description {
3590
+ width: 100%;
3591
+ height: 14px;
3592
+ }
3593
+
3594
+ .taskon-quest-skeleton-description--short {
3595
+ width: 66%;
3596
+ }
3597
+
3598
+ .taskon-quest-skeleton-section-title {
3599
+ width: 128px;
3600
+ height: 28px;
3601
+ }
3602
+
3603
+ .taskon-quest-skeleton-progress {
3604
+ width: 182px;
3605
+ height: 20px;
3606
+ border-radius: 999px;
3607
+ }
3608
+
3609
+ .taskon-quest-skeleton-task {
3610
+ width: 100%;
3611
+ height: 74px;
3612
+ border-radius: var(--taskon-border-radius-lg);
3613
+ }
3614
+
3615
+ .taskon-quest-skeleton-complete-button {
3616
+ width: 100%;
3617
+ height: 48px;
3618
+ border-radius: var(--taskon-border-radius);
3619
+ }
3620
+
3621
+ .taskon-quest-skeleton-divider {
3622
+ background: var(--taskon-color-border-secondary);
3623
+ }
3624
+
3625
+ .taskon-quest-skeleton-panel {
3626
+ display: flex;
3627
+ flex-direction: column;
3628
+ gap: 12px;
3629
+ padding: 20px;
3630
+ border: 1px solid var(--taskon-color-border-secondary);
3631
+ border-radius: var(--taskon-border-radius-lg);
3610
3632
  }
3611
3633
 
3612
- @keyframes taskon-quest-spin {
3634
+ .taskon-quest-skeleton-panel-title {
3635
+ width: 45%;
3636
+ height: 22px;
3637
+ }
3638
+
3639
+ .taskon-quest-skeleton-panel-line {
3640
+ width: 100%;
3641
+ height: 14px;
3642
+ }
3643
+
3644
+ .taskon-quest-skeleton-panel-line--short {
3645
+ width: 72%;
3646
+ }
3647
+
3648
+ @keyframes taskon-quest-skeleton-shimmer {
3613
3649
  to {
3614
- transform: rotate(360deg);
3650
+ transform: translateX(100%);
3651
+ }
3652
+ }
3653
+
3654
+ @media (prefers-reduced-motion: reduce) {
3655
+ .taskon-quest-skeleton-block::after {
3656
+ animation: none;
3615
3657
  }
3616
3658
  }
3617
3659
 
@@ -3673,11 +3715,13 @@ a.taskon-quest-footer-action-btn {
3673
3715
 
3674
3716
  .taskon-quest-layout {
3675
3717
  display: flex;
3718
+ flex-direction: column;
3676
3719
  gap: var(--taskon-spacing-xl);
3677
3720
  align-items: flex-start;
3678
3721
  }
3679
3722
 
3680
3723
  /* 左侧主内容区(固定比例 2:1) */
3724
+
3681
3725
  .taskon-quest-content {
3682
3726
  flex: 2;
3683
3727
  min-width: 0;
@@ -3687,16 +3731,20 @@ a.taskon-quest-footer-action-btn {
3687
3731
  }
3688
3732
 
3689
3733
  /* 中间分割线 */
3734
+
3690
3735
  .taskon-quest-divider {
3691
- width: 1px;
3736
+ width: 100%;
3737
+ height: 1px;
3692
3738
  align-self: stretch;
3693
3739
  background: var(--taskon-color-border-secondary);
3694
3740
  flex-shrink: 0;
3695
3741
  }
3696
3742
 
3697
3743
  /* 右侧边栏(固定比例 2:1) */
3744
+
3698
3745
  .taskon-quest-sidebar {
3699
3746
  flex: 1;
3747
+ width: 100%;
3700
3748
  min-width: 0;
3701
3749
  display: flex;
3702
3750
  flex-direction: column;
@@ -3714,6 +3762,7 @@ a.taskon-quest-footer-action-btn {
3714
3762
  }
3715
3763
 
3716
3764
  /* 标题 + 倒计时区域 */
3765
+
3717
3766
  .taskon-quest-header-title-section {
3718
3767
  display: flex;
3719
3768
  flex-direction: column;
@@ -3729,18 +3778,26 @@ a.taskon-quest-footer-action-btn {
3729
3778
  }
3730
3779
 
3731
3780
  /* 倒计时 + 时间范围 */
3781
+
3732
3782
  .taskon-quest-header-meta {
3733
3783
  display: flex;
3734
- align-items: center;
3735
- gap: var(--taskon-spacing-md);
3784
+ flex-wrap: wrap;
3785
+ align-items: flex-start;
3786
+ gap: 8px 10px;
3736
3787
  padding: var(--taskon-spacing-xs) 0;
3788
+ border: none;
3737
3789
  border-radius: var(--taskon-border-radius-sm);
3790
+ background: transparent;
3738
3791
  }
3739
3792
 
3740
3793
  .taskon-quest-countdown {
3741
3794
  display: flex;
3742
- gap: var(--taskon-spacing-sm);
3795
+ order: 3;
3796
+ flex: 1 1 100%;
3797
+ flex-wrap: wrap;
3798
+ gap: 6px;
3743
3799
  align-items: center;
3800
+ min-width: 0;
3744
3801
  }
3745
3802
 
3746
3803
  .taskon-quest-countdown-icon {
@@ -3751,62 +3808,88 @@ a.taskon-quest-footer-action-btn {
3751
3808
  }
3752
3809
 
3753
3810
  .taskon-quest-countdown-label {
3754
- font-size: 16px;
3811
+ font-size: 14px;
3755
3812
  font-weight: 400;
3756
- line-height: 24px;
3813
+ line-height: 20px;
3757
3814
  color: var(--taskon-color-text-secondary);
3758
3815
  }
3759
3816
 
3760
3817
  /* 已结束状态的标签样式 */
3818
+
3761
3819
  .taskon-quest-countdown-label--ended {
3762
3820
  font-weight: 600;
3763
3821
  text-transform: uppercase;
3764
3822
  }
3765
3823
 
3766
3824
  .taskon-quest-countdown-value {
3767
- font-size: 16px;
3825
+ font-size: 14px;
3768
3826
  font-weight: 600;
3769
- line-height: 24px;
3827
+ line-height: 20px;
3770
3828
  color: var(--taskon-color-primary);
3771
3829
  }
3772
3830
 
3773
3831
  .taskon-quest-countdown-divider {
3774
- width: 1px;
3775
- height: 20px;
3776
- background-color: var(--taskon-color-border-secondary);
3832
+ display: none;
3777
3833
  }
3778
3834
 
3779
3835
  .taskon-quest-time-range {
3780
- font-size: 16px;
3781
- font-weight: 400;
3782
- line-height: 24px;
3836
+ order: 1;
3837
+ display: flex;
3838
+ flex: 1 1 auto;
3839
+ flex-direction: column;
3840
+ gap: 2px;
3841
+ min-width: 0;
3842
+ font-size: 14px;
3843
+ font-weight: 500;
3844
+ line-height: 20px;
3783
3845
  color: var(--taskon-color-text-secondary);
3784
3846
  }
3785
3847
 
3848
+ .taskon-quest-time-range-timezone {
3849
+ font-size: 12px;
3850
+ font-weight: 500;
3851
+ line-height: 16px;
3852
+ color: var(--taskon-color-text-tertiary);
3853
+ }
3854
+
3855
+ .taskon-quest-time-range-values {
3856
+ display: flex;
3857
+ flex-wrap: wrap;
3858
+ align-items: center;
3859
+ gap: 6px;
3860
+ word-break: break-word;
3861
+ overflow-wrap: anywhere;
3862
+ }
3863
+
3864
+ .taskon-quest-time-range-separator {
3865
+ color: var(--taskon-color-text-tertiary);
3866
+ }
3867
+
3868
+ .taskon-quest-header-meta .taskon-quest-share-trigger {
3869
+ order: 2;
3870
+ width: 34px;
3871
+ height: 34px;
3872
+ border: none;
3873
+ background: transparent;
3874
+ }
3875
+
3786
3876
  /* Banner 图片 */
3877
+
3787
3878
  .taskon-quest-banner {
3788
3879
  display: block;
3789
3880
  margin: 0 auto;
3790
3881
  width: 100%;
3791
- border-radius: 10px;
3882
+ border-radius: var(--taskon-border-radius-lg);
3792
3883
  }
3793
3884
 
3794
3885
  .taskon-quest-banner-img {
3795
3886
  display: block;
3796
3887
  width: 100%;
3797
- border-radius: 10px;
3798
- }
3799
-
3800
- /* 方形图片在 PC 端限制宽度 */
3801
- @media (min-width: 751px) {
3802
- .taskon-quest-banner--square .taskon-quest-banner-img {
3803
- width: 340px;
3804
- max-width: 100%;
3805
- margin: 0 auto;
3806
- }
3888
+ border-radius: var(--taskon-border-radius-lg);
3807
3889
  }
3808
3890
 
3809
3891
  /* 描述 + View More */
3892
+
3810
3893
  .taskon-quest-desc {
3811
3894
  position: relative;
3812
3895
  display: flex;
@@ -3826,11 +3909,13 @@ a.taskon-quest-footer-action-btn {
3826
3909
  }
3827
3910
 
3828
3911
  /* 展开后移除高度限制和渐变 */
3912
+
3829
3913
  .taskon-quest-desc-text--expanded {
3830
3914
  max-height: none;
3831
3915
  }
3832
3916
 
3833
3917
  /* 描述渐变遮罩 - 仅在未展开时显示 */
3918
+
3834
3919
  .taskon-quest-desc-text:not(.taskon-quest-desc-text--expanded)::after {
3835
3920
  content: "";
3836
3921
  position: absolute;
@@ -3847,6 +3932,7 @@ a.taskon-quest-footer-action-btn {
3847
3932
  }
3848
3933
 
3849
3934
  /* 富文本样式重置 */
3935
+
3850
3936
  .taskon-quest-desc-text p {
3851
3937
  margin: 0 0 var(--taskon-spacing-sm) 0;
3852
3938
  }
@@ -3871,6 +3957,7 @@ a.taskon-quest-footer-action-btn {
3871
3957
  }
3872
3958
 
3873
3959
  /* 图片样式:限制最大宽度,防止溢出 */
3960
+
3874
3961
  .taskon-quest-desc-text img {
3875
3962
  max-width: 100%;
3876
3963
  height: auto;
@@ -3878,6 +3965,7 @@ a.taskon-quest-footer-action-btn {
3878
3965
  }
3879
3966
 
3880
3967
  /* iframe 样式:限制最大宽度 */
3968
+
3881
3969
  .taskon-quest-desc-text iframe {
3882
3970
  max-width: 100%;
3883
3971
  border-radius: var(--taskon-border-radius);
@@ -3903,6 +3991,7 @@ a.taskon-quest-footer-action-btn {
3903
3991
  }
3904
3992
 
3905
3993
  /* 分割线 */
3994
+
3906
3995
  .taskon-quest-content-divider {
3907
3996
  height: 1px;
3908
3997
  background: var(--taskon-color-border-secondary);
@@ -3919,6 +4008,7 @@ a.taskon-quest-footer-action-btn {
3919
4008
  }
3920
4009
 
3921
4010
  /* Quest 标题 */
4011
+
3922
4012
  .taskon-quest-tasks-header {
3923
4013
  display: flex;
3924
4014
  gap: var(--taskon-spacing-md);
@@ -3934,6 +4024,7 @@ a.taskon-quest-footer-action-btn {
3934
4024
  }
3935
4025
 
3936
4026
  /* 任务列表 */
4027
+
3937
4028
  .taskon-quest-tasks-list {
3938
4029
  display: flex;
3939
4030
  flex-direction: column;
@@ -3961,6 +4052,7 @@ a.taskon-quest-footer-action-btn {
3961
4052
  }
3962
4053
 
3963
4054
  /* Complete 按钮 */
4055
+
3964
4056
  .taskon-quest-complete-btn {
3965
4057
  width: 100%;
3966
4058
  margin-top: var(--taskon-spacing-lg);
@@ -4120,24 +4212,214 @@ a.taskon-quest-footer-action-btn {
4120
4212
  }
4121
4213
 
4122
4214
  /* ============================================================================
4123
- 响应式布局(TODO: Phase 13 完善)
4215
+ 响应式布局
4124
4216
  ============================================================================ */
4125
4217
 
4126
- @media (max-width: 1200px) {
4218
+ @supports (container-type: inline-size) {
4219
+ @container (min-width: 751px) {
4127
4220
  .taskon-quest-layout {
4128
- flex-direction: column;
4221
+ flex-direction: row;
4129
4222
  }
4130
4223
 
4131
4224
  .taskon-quest-divider {
4132
- width: 100%;
4133
- height: 1px;
4134
- background: var(--taskon-color-border-secondary);
4225
+ width: 1px;
4226
+ height: auto;
4135
4227
  }
4136
4228
 
4137
4229
  .taskon-quest-sidebar {
4138
- width: 100%;
4230
+ width: auto;
4231
+ }
4232
+
4233
+ .taskon-quest-header-meta {
4234
+ flex-wrap: nowrap;
4235
+ align-items: center;
4236
+ gap: var(--taskon-spacing-md);
4237
+ padding: var(--taskon-spacing-xs) 0;
4238
+ border: none;
4239
+ background: transparent;
4240
+ }
4241
+
4242
+ .taskon-quest-countdown {
4243
+ order: 0;
4244
+ flex: 0 0 auto;
4245
+ flex-wrap: nowrap;
4246
+ gap: var(--taskon-spacing-sm);
4247
+ }
4248
+
4249
+ .taskon-quest-countdown-label,
4250
+ .taskon-quest-countdown-value {
4251
+ font-size: 16px;
4252
+ line-height: 24px;
4253
+ }
4254
+
4255
+ .taskon-quest-countdown-divider {
4256
+ display: block;
4257
+ width: 1px;
4258
+ height: 20px;
4259
+ background-color: var(--taskon-color-border-secondary);
4260
+ }
4261
+
4262
+ .taskon-quest-time-range {
4263
+ order: 0;
4264
+ flex: 0 1 auto;
4265
+ flex-direction: row;
4266
+ gap: 8px;
4267
+ font-size: 16px;
4268
+ font-weight: 400;
4269
+ line-height: 24px;
4270
+ }
4271
+
4272
+ .taskon-quest-time-range-timezone {
4273
+ font-size: 16px;
4274
+ font-weight: 400;
4275
+ line-height: 24px;
4276
+ color: var(--taskon-color-text-secondary);
4277
+ }
4278
+
4279
+ .taskon-quest-time-range-values {
4280
+ flex-wrap: nowrap;
4281
+ gap: 8px;
4282
+ word-break: normal;
4283
+ overflow-wrap: normal;
4284
+ }
4285
+
4286
+ .taskon-quest-time-range-separator {
4287
+ color: var(--taskon-color-text-secondary);
4288
+ }
4289
+
4290
+ .taskon-quest-header-meta .taskon-quest-share-trigger {
4291
+ order: 0;
4292
+ width: 40px;
4293
+ height: 40px;
4294
+ border: none;
4295
+ background: var(--taskon-color-bg-surface);
4296
+ }
4297
+
4298
+ /* 方形图片在桌面端限制宽度 */
4299
+ .taskon-quest-banner--square .taskon-quest-banner-img {
4300
+ width: 340px;
4301
+ max-width: 100%;
4302
+ margin: 0 auto;
4303
+ }
4304
+
4305
+ .taskon-quest-skeleton-content,
4306
+ .taskon-quest-skeleton-sidebar {
4307
+ width: auto;
4308
+ gap: var(--taskon-spacing-lg);
4309
+ }
4310
+
4311
+ .taskon-quest-skeleton-banner {
4312
+ height: 220px;
4313
+ }
4314
+
4315
+ .taskon-quest-skeleton-task {
4316
+ height: 84px;
4317
+ }
4318
+ }
4319
+ }
4320
+
4321
+ @supports not (container-type: inline-size) {
4322
+ @media (min-width: 751px) {
4323
+ .taskon-quest-layout {
4324
+ flex-direction: row;
4325
+ }
4326
+
4327
+ .taskon-quest-divider {
4328
+ width: 1px;
4329
+ height: auto;
4330
+ }
4331
+
4332
+ .taskon-quest-sidebar {
4333
+ width: auto;
4334
+ }
4335
+
4336
+ .taskon-quest-header-meta {
4337
+ flex-wrap: nowrap;
4338
+ align-items: center;
4339
+ gap: var(--taskon-spacing-md);
4340
+ padding: var(--taskon-spacing-xs) 0;
4341
+ border: none;
4342
+ background: transparent;
4343
+ }
4344
+
4345
+ .taskon-quest-countdown {
4346
+ order: 0;
4347
+ flex: 0 0 auto;
4348
+ flex-wrap: nowrap;
4349
+ gap: var(--taskon-spacing-sm);
4350
+ }
4351
+
4352
+ .taskon-quest-countdown-label,
4353
+ .taskon-quest-countdown-value {
4354
+ font-size: 16px;
4355
+ line-height: 24px;
4356
+ }
4357
+
4358
+ .taskon-quest-countdown-divider {
4359
+ display: block;
4360
+ width: 1px;
4361
+ height: 20px;
4362
+ background-color: var(--taskon-color-border-secondary);
4363
+ }
4364
+
4365
+ .taskon-quest-time-range {
4366
+ order: 0;
4367
+ flex: 0 1 auto;
4368
+ flex-direction: row;
4369
+ gap: 8px;
4370
+ font-size: 16px;
4371
+ font-weight: 400;
4372
+ line-height: 24px;
4373
+ }
4374
+
4375
+ .taskon-quest-time-range-timezone {
4376
+ font-size: 16px;
4377
+ font-weight: 400;
4378
+ line-height: 24px;
4379
+ color: var(--taskon-color-text-secondary);
4380
+ }
4381
+
4382
+ .taskon-quest-time-range-values {
4383
+ flex-wrap: nowrap;
4384
+ gap: 8px;
4385
+ word-break: normal;
4386
+ overflow-wrap: normal;
4387
+ }
4388
+
4389
+ .taskon-quest-time-range-separator {
4390
+ color: var(--taskon-color-text-secondary);
4391
+ }
4392
+
4393
+ .taskon-quest-header-meta .taskon-quest-share-trigger {
4394
+ order: 0;
4395
+ width: 40px;
4396
+ height: 40px;
4397
+ border: none;
4398
+ background: var(--taskon-color-bg-surface);
4399
+ }
4400
+
4401
+ /* 方形图片在桌面端限制宽度 */
4402
+ .taskon-quest-banner--square .taskon-quest-banner-img {
4403
+ width: 340px;
4404
+ max-width: 100%;
4405
+ margin: 0 auto;
4406
+ }
4407
+
4408
+ .taskon-quest-skeleton-content,
4409
+ .taskon-quest-skeleton-sidebar {
4410
+ width: auto;
4411
+ gap: var(--taskon-spacing-lg);
4412
+ }
4413
+
4414
+ .taskon-quest-skeleton-banner {
4415
+ height: 220px;
4416
+ }
4417
+
4418
+ .taskon-quest-skeleton-task {
4419
+ height: 84px;
4420
+ }
4421
+ }
4139
4422
  }
4140
- }
4141
4423
 
4142
4424
  /* Eligibility 组件样式已抽取到独立文件: Quest/components/Eligibility/eligibility.css */
4143
4425