@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
@@ -7,25 +7,41 @@
7
7
  * while intentionally removing the glow background layer.
8
8
  */
9
9
 
10
+ /*
11
+ * Responsive base styles
12
+ *
13
+ * Keep mobile breakpoints and fallback patterns centralized here.
14
+ * Components should reuse these mixins instead of duplicating query logic.
15
+ */
16
+
17
+ /*
18
+ * Desktop-up mixin:
19
+ * 1) Enable desktop enhancement in wider containers
20
+ * 2) Keep viewport media query as fallback
21
+ */
22
+
10
23
  /* Narrow the default dialog body padding for this notice layout */
24
+
11
25
  .taskon-confirm-notice-dialog .taskon-dialog-body {
12
26
  padding: 0;
13
27
  }
14
28
 
15
29
  /* ConfirmNotice content root */
30
+
16
31
  .taskon-confirm-notice {
17
32
  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;
33
+ width: auto;
34
+ max-width: none;
35
+ padding: var(--taskon-spacing-xl) var(--taskon-spacing-lg) var(--taskon-spacing-lg);
36
+ background: var(--taskon-color-bg-floating);
37
+ color: var(--taskon-color-text);
38
+ border-radius: var(--taskon-border-radius-lg);
24
39
  text-align: center;
25
40
  box-sizing: border-box;
26
41
  }
27
42
 
28
43
  /* Status icon */
44
+
29
45
  .taskon-confirm-notice-icon {
30
46
  width: 46px;
31
47
  height: 46px;
@@ -34,29 +50,33 @@
34
50
  }
35
51
 
36
52
  /* Title */
53
+
37
54
  .taskon-confirm-notice-title {
38
55
  margin: 20px 0 0;
39
56
  font-weight: 600;
40
57
  font-size: 22px;
41
58
  line-height: 28px;
42
- color: var(--taskon-color-text, #ffffff);
59
+ color: var(--taskon-color-text);
43
60
  white-space: pre-wrap;
44
61
  }
45
62
 
46
63
  /* Description */
64
+
47
65
  .taskon-confirm-notice-desc {
48
66
  margin: 10px 0 0;
49
67
  font-size: 16px;
50
68
  line-height: 20px;
51
- color: var(--taskon-color-text-secondary, rgba(255, 255, 255, 0.7));
69
+ color: var(--taskon-color-text-secondary);
52
70
  white-space: pre-wrap;
53
71
  }
54
72
 
55
73
  /* Action container */
74
+
56
75
  .taskon-confirm-notice-buttons {
57
76
  margin-top: 20px;
58
77
  display: flex;
59
- align-items: center;
78
+ flex-direction: column;
79
+ align-items: stretch;
60
80
  justify-content: center;
61
81
  gap: 10px;
62
82
  }
@@ -66,8 +86,10 @@
66
86
  }
67
87
 
68
88
  /* Base action button style */
89
+
69
90
  .taskon-confirm-notice-button {
70
- min-width: 161px;
91
+ width: 100%;
92
+ min-width: 100%;
71
93
  height: 36px;
72
94
  padding: 0 16px;
73
95
  border-radius: 8px;
@@ -86,68 +108,71 @@
86
108
  }
87
109
 
88
110
  /* Cancel button */
111
+
89
112
  .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);
113
+ color: var(--taskon-color-text);
114
+ background: var(--taskon-color-bg-surface-subtle);
115
+ border-color: var(--taskon-color-border);
93
116
  }
94
117
 
95
118
  .taskon-confirm-notice-button--cancel:hover:not(:disabled),
96
119
  .taskon-confirm-notice-button--cancel:focus-visible:not(:disabled) {
97
- background: rgba(255, 255, 255, 0.16);
120
+ background: var(--taskon-color-bg-surface);
98
121
  }
99
122
 
100
123
  /* Confirm button */
124
+
101
125
  .taskon-confirm-notice-button--confirm {
102
- color: #000000;
103
- background: var(--taskon-color-primary, #cbff01);
126
+ color: var(--taskon-color-text-on-primary);
127
+ background: var(--taskon-color-primary);
104
128
  }
105
129
 
106
130
  .taskon-confirm-notice-button--confirm:hover:not(:disabled),
107
131
  .taskon-confirm-notice-button--confirm:focus-visible:not(:disabled) {
108
- filter: brightness(0.95);
132
+ background: var(--taskon-color-primary-hover);
109
133
  }
110
134
 
111
- /* Mobile adaptation (aligned with original vw-based behavior) */
112
- @media (max-width: 750px) {
135
+ /* Desktop 增强 */
136
+
137
+ @supports (container-type: inline-size) {
138
+ @container (min-width: 751px) {
113
139
  .taskon-confirm-notice {
114
- max-width: none;
115
- width: auto;
116
- padding: 8vw 6.667vw 6.667vw;
140
+ width: 100%;
141
+ max-width: 470px;
142
+ padding: 40px 55px;
117
143
  }
118
144
 
119
- .taskon-confirm-notice-icon {
120
- width: 7.467vw;
121
- height: 7.467vw;
145
+ .taskon-confirm-notice-buttons {
146
+ flex-direction: row;
147
+ align-items: center;
122
148
  }
123
149
 
124
- .taskon-confirm-notice-title {
125
- margin-top: 4vw;
126
- font-size: 4.533vw;
127
- line-height: 5.733vw;
150
+ .taskon-confirm-notice-button {
151
+ width: auto;
152
+ min-width: 161px;
153
+ }
154
+ }
128
155
  }
129
156
 
130
- .taskon-confirm-notice-desc {
131
- margin-top: 2vw;
132
- font-size: 3.733vw;
133
- line-height: 4.667vw;
157
+ @supports not (container-type: inline-size) {
158
+ @media (min-width: 751px) {
159
+ .taskon-confirm-notice {
160
+ width: 100%;
161
+ max-width: 470px;
162
+ padding: 40px 55px;
134
163
  }
135
164
 
136
165
  .taskon-confirm-notice-buttons {
137
- margin-top: 5.333vw;
138
- flex-direction: column;
139
- gap: 2.667vw;
166
+ flex-direction: row;
167
+ align-items: center;
140
168
  }
141
169
 
142
170
  .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;
171
+ width: auto;
172
+ min-width: 161px;
173
+ }
174
+ }
149
175
  }
150
- }
151
176
  /**
152
177
  * Textarea 通用组件样式
153
178
  * @description 复刻 Vue 版本 BaseTextareaPro.vue 样式
@@ -155,12 +180,14 @@
155
180
  */
156
181
 
157
182
  /* ==================== 容器 ==================== */
183
+
158
184
  .taskon-textarea-wrap {
159
185
  position: relative;
160
186
  font-size: 0;
161
187
  }
162
188
 
163
189
  /* ==================== 文本域 ==================== */
190
+
164
191
  .taskon-textarea {
165
192
  width: 100%;
166
193
  min-height: 100px;
@@ -195,6 +222,7 @@
195
222
  }
196
223
 
197
224
  /* ==================== 字数统计 ==================== */
225
+
198
226
  .taskon-textarea-count {
199
227
  position: absolute;
200
228
  right: 20px;
@@ -208,29 +236,13 @@
208
236
  .taskon-textarea-count-current {
209
237
  color: var(--taskon-color-text);
210
238
  }
211
-
212
- /* ==================== 响应式 ==================== */
213
- @media (max-width: 750px) {
214
- .taskon-textarea {
215
- min-height: 26.667vw;
216
- padding: 3.2vw;
217
- padding-bottom: 8vw; /* 给计数器留空间 */
218
- font-size: 3.733vw;
219
- }
220
-
221
- .taskon-textarea-count {
222
- right: 2.933vw;
223
- bottom: 2.667vw;
224
- font-size: 2.933vw;
225
- line-height: 2.667vw;
226
- }
227
- }
228
239
  /**
229
240
  * TitleExpress 组件样式
230
241
  * @module components/TitleExpress
231
242
  */
232
243
 
233
244
  /* 可点击链接 - 统一蓝色加下划线样式 */
245
+
234
246
  .taskon-title-express-link {
235
247
  display: inline;
236
248
  color: var(--taskon-color-link);
@@ -244,6 +256,7 @@
244
256
  }
245
257
 
246
258
  /* 可复制文本 */
259
+
247
260
  .taskon-title-express-copy {
248
261
  display: inline;
249
262
  color: var(--taskon-color-secondary);
@@ -251,6 +264,7 @@
251
264
  }
252
265
 
253
266
  /* Radix Popover 内容 */
267
+
254
268
  .taskon-title-express-popover-content {
255
269
  display: flex;
256
270
  align-items: center;
@@ -280,6 +294,7 @@
280
294
  }
281
295
 
282
296
  /* 复制图标 */
297
+
283
298
  .taskon-title-express-copy-icon {
284
299
  width: 14px;
285
300
  height: 14px;
@@ -287,11 +302,13 @@
287
302
  }
288
303
 
289
304
  /* Radix Popover 箭头 */
305
+
290
306
  .taskon-title-express-popover-arrow {
291
307
  fill: var(--taskon-color-bg-floating);
292
308
  }
293
309
 
294
310
  /* 动画 */
311
+
295
312
  @keyframes taskon-popover-fade-in {
296
313
  from {
297
314
  opacity: 0;
@@ -302,22 +319,6 @@
302
319
  transform: translateY(0);
303
320
  }
304
321
  }
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
  /**
322
323
  * CardDescExpress 组件样式
323
324
  * @module components/CardDescExpress
@@ -346,6 +347,7 @@
346
347
  }
347
348
 
348
349
  /* ========== 基础防护(降低宿主 reset 影响) ========== */
350
+
349
351
  .taskon-card-desc-rich,
350
352
  .taskon-card-desc-rich *,
351
353
  .taskon-card-desc-rich *::before,
@@ -354,6 +356,7 @@
354
356
  }
355
357
 
356
358
  /* ========== 基础块元素(对齐 Quill 编辑器语义) ========== */
359
+
357
360
  .taskon-card-desc-rich p,
358
361
  .taskon-card-desc-rich ol,
359
362
  .taskon-card-desc-rich ul,
@@ -378,14 +381,6 @@
378
381
  color: var(--taskon-color-text);
379
382
  }
380
383
 
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
384
  .taskon-card-desc-rich h2 {
390
385
  font-size: 1.5em;
391
386
  }
@@ -407,6 +402,7 @@
407
402
  }
408
403
 
409
404
  /* ========== 列表(核心:确保圆点/编号稳定可见) ========== */
405
+
410
406
  .taskon-card-desc-rich ol,
411
407
  .taskon-card-desc-rich ul {
412
408
  margin: 0.5em 0;
@@ -567,6 +563,7 @@
567
563
  }
568
564
 
569
565
  /* ========== 缩进与对齐(对齐 Quill class 语义) ========== */
566
+
570
567
  .taskon-card-desc-rich .ql-indent-1:not(.ql-direction-rtl) {
571
568
  padding-left: 3em;
572
569
  }
@@ -729,6 +726,7 @@
729
726
  }
730
727
 
731
728
  /* ========== 常见富文本元素 ========== */
729
+
732
730
  .taskon-card-desc-rich a {
733
731
  color: var(--taskon-color-link);
734
732
  text-decoration: underline;
@@ -788,53 +786,58 @@
788
786
  width: 100%;
789
787
  max-width: 100%;
790
788
  }
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;
798
- }
799
-
800
- .taskon-card-desc-rich--no-max-height {
801
- margin-top: 0;
802
- max-height: none;
803
- }
804
- }
805
789
  /**
806
790
  * TaskVerifyFailedDialog styles
807
791
  * @description Match Vue ErrorInfo content rhythm and readability.
808
792
  */
809
793
 
794
+ /*
795
+ * Responsive base styles
796
+ *
797
+ * Keep mobile breakpoints and fallback patterns centralized here.
798
+ * Components should reuse these mixins instead of duplicating query logic.
799
+ */
800
+
801
+ /*
802
+ * Desktop-up mixin:
803
+ * 1) Enable desktop enhancement in wider containers
804
+ * 2) Keep viewport media query as fallback
805
+ */
806
+
810
807
  .taskon-task-verify-failed-dialog .taskon-dialog-body {
811
808
  padding: 0;
812
809
  }
813
810
 
814
811
  .taskon-task-verify-failed-dialog-message {
815
- margin-top: 10px;
812
+ margin-top: var(--taskon-spacing-sm);
816
813
  font-size: 16px;
817
814
  line-height: 20px;
818
815
  color: var(--taskon-color-text-tertiary);
819
816
  white-space: pre-wrap;
820
817
  }
821
-
822
- @media (max-width: 750px) {
823
- .taskon-task-verify-failed-dialog-message {
824
- margin-top: 3.73vw;
825
- font-size: 3.73vw;
826
- line-height: 4.67vw;
827
- }
828
- }
829
818
  /**
830
819
  * PowTask Styles
831
820
  * @description POW 任务样式
832
821
  * 遵循 Widget 命名规范:.taskon-{widget-name}-{element}
833
822
  */
834
823
 
824
+ /*
825
+ * Responsive base styles
826
+ *
827
+ * Keep mobile breakpoints and fallback patterns centralized here.
828
+ * Components should reuse these mixins instead of duplicating query logic.
829
+ */
830
+
831
+ /*
832
+ * Desktop-up mixin:
833
+ * 1) Enable desktop enhancement in wider containers
834
+ * 2) Keep viewport media query as fallback
835
+ */
836
+
835
837
  /* ============================================
836
838
  * POW Task Container
837
839
  * ============================================ */
840
+
838
841
  .taskon-pow-task {
839
842
  /* 继承 TaskCardBase 的样式 */
840
843
  }
@@ -842,6 +845,7 @@
842
845
  /* ============================================
843
846
  * POW Input Area
844
847
  * ============================================ */
848
+
845
849
  .taskon-pow-input-area {
846
850
  margin-top: var(--taskon-spacing-md);
847
851
  }
@@ -849,14 +853,17 @@
849
853
  /* ============================================
850
854
  * URL Input Row
851
855
  * ============================================ */
856
+
852
857
  .taskon-pow-url-row {
853
858
  display: flex;
854
- align-items: center;
855
- gap: var(--taskon-spacing-md);
859
+ flex-direction: column;
860
+ align-items: stretch;
861
+ gap: var(--taskon-spacing-sm);
856
862
  }
857
863
 
858
864
  .taskon-pow-input {
859
865
  flex: 1;
866
+ width: 100%;
860
867
  padding: var(--taskon-spacing-sm)
861
868
  var(--taskon-spacing-md);
862
869
  border: 1px solid var(--taskon-color-border);
@@ -884,10 +891,12 @@
884
891
  /* ============================================
885
892
  * Text Input Row
886
893
  * ============================================ */
894
+
887
895
  .taskon-pow-text-row {
888
896
  display: flex;
889
- align-items: flex-end;
890
- gap: var(--taskon-spacing-md);
897
+ flex-direction: column;
898
+ align-items: stretch;
899
+ gap: var(--taskon-spacing-sm);
891
900
  }
892
901
 
893
902
  .taskon-pow-text-row .taskon-textarea-wrap {
@@ -897,12 +906,18 @@
897
906
  /* ============================================
898
907
  * Image Upload Area - 与 Vue 版本 PowImageUploader 一致
899
908
  * ============================================ */
909
+
900
910
  .taskon-pow-image-uploader {
901
- margin-top: var(--taskon-spacing-lg);
911
+ margin-top: var(--taskon-spacing-md);
902
912
  display: flex;
903
913
  align-items: center;
904
914
  }
905
915
 
916
+ .taskon-pow-url-row .taskon-verify-btn,
917
+ .taskon-pow-text-row .taskon-verify-btn {
918
+ width: 100%;
919
+ }
920
+
906
921
  .taskon-pow-image-upload-area {
907
922
  flex: 1;
908
923
  position: relative;
@@ -959,6 +974,7 @@
959
974
  }
960
975
 
961
976
  /* Hover mask overlay */
977
+
962
978
  .taskon-pow-image-mask {
963
979
  display: none;
964
980
  position: absolute;
@@ -985,6 +1001,7 @@
985
1001
  }
986
1002
 
987
1003
  /* Progress bar at bottom */
1004
+
988
1005
  .taskon-pow-image-progress-bar {
989
1006
  z-index: 3;
990
1007
  position: absolute;
@@ -1005,6 +1022,7 @@
1005
1022
  /* ============================================
1006
1023
  * Error Message
1007
1024
  * ============================================ */
1025
+
1008
1026
  .taskon-pow-error {
1009
1027
  margin-top: 10px;
1010
1028
  font-size: 14px;
@@ -1014,7 +1032,9 @@
1014
1032
  /* ============================================
1015
1033
  * Average Review Time
1016
1034
  * ============================================ */
1035
+
1017
1036
  /* 与 Vue 版本 AverageReview.vue 样式一致 */
1037
+
1018
1038
  .taskon-pow-review-time {
1019
1039
  margin-top: 10px;
1020
1040
  color: var(--taskon-color-warning);
@@ -1024,47 +1044,58 @@
1024
1044
  }
1025
1045
 
1026
1046
  /* ============================================
1027
- * Responsive Styles
1047
+ * Desktop 增强
1028
1048
  * ============================================ */
1029
- @media (max-width: 750px) {
1030
- .taskon-pow-url-row,
1031
- .taskon-pow-text-row {
1032
- flex-direction: column;
1033
- gap: 10px;
1049
+
1050
+ @supports (container-type: inline-size) {
1051
+ @container (min-width: 751px) {
1052
+ .taskon-pow-url-row {
1053
+ flex-direction: row;
1054
+ align-items: center;
1055
+ gap: var(--taskon-spacing-md);
1034
1056
  }
1035
1057
 
1036
- .taskon-pow-input {
1037
- width: 100%;
1058
+ .taskon-pow-text-row {
1059
+ flex-direction: row;
1060
+ align-items: flex-end;
1061
+ gap: var(--taskon-spacing-md);
1038
1062
  }
1039
1063
 
1040
1064
  .taskon-pow-url-row .taskon-verify-btn,
1041
1065
  .taskon-pow-text-row .taskon-verify-btn {
1042
- width: 100%;
1066
+ width: auto;
1043
1067
  }
1044
1068
 
1045
1069
  .taskon-pow-image-uploader {
1046
- margin-top: 2.67vw;
1070
+ margin-top: var(--taskon-spacing-lg);
1071
+ }
1072
+ }
1047
1073
  }
1048
1074
 
1049
- .taskon-pow-image-upload-area {
1050
- min-height: 17.07vw;
1075
+ @supports not (container-type: inline-size) {
1076
+ @media (min-width: 751px) {
1077
+ .taskon-pow-url-row {
1078
+ flex-direction: row;
1079
+ align-items: center;
1080
+ gap: var(--taskon-spacing-md);
1051
1081
  }
1052
1082
 
1053
- .taskon-pow-image-upload-icon {
1054
- width: 2.4vw;
1055
- height: 2.4vw;
1083
+ .taskon-pow-text-row {
1084
+ flex-direction: row;
1085
+ align-items: flex-end;
1086
+ gap: var(--taskon-spacing-md);
1056
1087
  }
1057
1088
 
1058
- .taskon-pow-image-upload-tip {
1059
- margin-top: 1.33vw;
1060
- font-size: 1.6vw;
1061
- line-height: 2.67vw;
1089
+ .taskon-pow-url-row .taskon-verify-btn,
1090
+ .taskon-pow-text-row .taskon-verify-btn {
1091
+ width: auto;
1062
1092
  }
1063
1093
 
1064
- .taskon-pow-image-preview {
1065
- max-height: 32vw;
1094
+ .taskon-pow-image-uploader {
1095
+ margin-top: var(--taskon-spacing-lg);
1096
+ }
1097
+ }
1066
1098
  }
1067
- }
1068
1099
  /* ============================================
1069
1100
  DynamicPoints Component Styles
1070
1101
  与 Vue 版本 BaseDynamicPoint.vue 样式一致
@@ -1177,6 +1208,7 @@
1177
1208
  }
1178
1209
 
1179
1210
  /* Content wrapper */
1211
+
1180
1212
  .taskon-swap-content {
1181
1213
  display: flex;
1182
1214
  flex-direction: column;
@@ -1184,6 +1216,7 @@
1184
1216
  }
1185
1217
 
1186
1218
  /* Rules section - 动态积分规则区域 */
1219
+
1187
1220
  .taskon-swap-rules-section {
1188
1221
  display: flex;
1189
1222
  flex-direction: column;
@@ -1223,6 +1256,7 @@
1223
1256
  }
1224
1257
 
1225
1258
  /* Instructions section - 任务描述区域 */
1259
+
1226
1260
  .taskon-swap-instructions-section {
1227
1261
  display: flex;
1228
1262
  flex-direction: column;
@@ -1251,6 +1285,7 @@
1251
1285
  }
1252
1286
 
1253
1287
  /* ==================== Customized Param Dialog ==================== */
1288
+
1254
1289
  .taskon-outer-point-api-dialog {
1255
1290
  display: flex;
1256
1291
  flex-direction: column;
@@ -1258,6 +1293,7 @@
1258
1293
  }
1259
1294
 
1260
1295
  /* Dialog title */
1296
+
1261
1297
  .taskon-outer-point-api-dialog-title {
1262
1298
  font-size: 18px;
1263
1299
  font-weight: 600;
@@ -1266,6 +1302,7 @@
1266
1302
  }
1267
1303
 
1268
1304
  /* Warning message */
1305
+
1269
1306
  .taskon-outer-point-api-dialog-warning {
1270
1307
  display: flex;
1271
1308
  align-items: center;
@@ -1285,6 +1322,7 @@
1285
1322
  }
1286
1323
 
1287
1324
  /* Description text */
1325
+
1288
1326
  .taskon-outer-point-api-dialog-desc {
1289
1327
  font-size: 14px;
1290
1328
  line-height: 20px;
@@ -1292,6 +1330,7 @@
1292
1330
  }
1293
1331
 
1294
1332
  /* Input area */
1333
+
1295
1334
  .taskon-outer-point-api-dialog-input-wrap {
1296
1335
  display: flex;
1297
1336
  flex-direction: column;
@@ -1337,6 +1376,7 @@
1337
1376
  }
1338
1377
 
1339
1378
  /* Action buttons */
1379
+
1340
1380
  .taskon-outer-point-api-dialog-actions {
1341
1381
  display: flex;
1342
1382
  justify-content: flex-end;
@@ -1383,10 +1423,24 @@
1383
1423
  * 命名规范:.taskon-task-{component}-{element}--{modifier}
1384
1424
  */
1385
1425
 
1426
+ /*
1427
+ * Responsive base styles
1428
+ *
1429
+ * Keep mobile breakpoints and fallback patterns centralized here.
1430
+ * Components should reuse these mixins instead of duplicating query logic.
1431
+ */
1432
+
1433
+ /*
1434
+ * Desktop-up mixin:
1435
+ * 1) Enable desktop enhancement in wider containers
1436
+ * 2) Keep viewport media query as fallback
1437
+ */
1438
+
1386
1439
  /* ============================================
1387
1440
  TaskList Styles
1388
1441
  与 Vue 版本 TaskList.vue + TaskType.vue 一致
1389
1442
  ============================================ */
1443
+
1390
1444
  .taskon-task-list {
1391
1445
  display: flex;
1392
1446
  flex-direction: column;
@@ -1394,28 +1448,29 @@
1394
1448
  }
1395
1449
 
1396
1450
  /* Progress section */
1451
+
1397
1452
  .taskon-task-list-progress-wrap {
1398
1453
  margin-bottom: var(--taskon-spacing-sm);
1399
1454
  }
1400
1455
 
1401
1456
  /* Section styles */
1457
+
1402
1458
  .taskon-task-list-section {
1403
1459
  display: flex;
1404
1460
  flex-direction: column;
1405
1461
  }
1406
1462
 
1407
1463
  .taskon-task-list-section-header {
1408
- display: flex;
1409
- justify-content: space-between;
1410
- align-items: center;
1411
- margin-top: 30px;
1412
- margin-bottom: 22px;
1464
+ display: block;
1465
+ margin-top: var(--taskon-spacing-lg);
1466
+ margin-bottom: var(--taskon-spacing-md);
1413
1467
  }
1414
1468
 
1415
1469
  .taskon-task-list-section-label {
1416
1470
  display: flex;
1417
1471
  align-items: center;
1418
- gap: 6px;
1472
+ flex-wrap: wrap;
1473
+ gap: var(--taskon-spacing-sm);
1419
1474
  }
1420
1475
 
1421
1476
  .taskon-task-list-section-title {
@@ -1438,63 +1493,82 @@
1438
1493
  .taskon-task-list-items {
1439
1494
  display: flex;
1440
1495
  flex-direction: column;
1441
- gap: 20px;
1496
+ gap: var(--taskon-spacing-md);
1442
1497
  }
1443
1498
 
1444
1499
  /* First section header doesn't need top margin */
1500
+
1445
1501
  .taskon-task-list-section:first-child .taskon-task-list-section-header {
1446
1502
  margin-top: 0;
1447
1503
  }
1448
1504
 
1449
1505
  /* Empty state */
1506
+
1450
1507
  .taskon-task-list-empty {
1451
1508
  padding: var(--taskon-spacing-lg);
1452
1509
  text-align: center;
1453
1510
  color: var(--taskon-color-text-disabled);
1454
1511
  }
1455
1512
 
1456
- /* Mobile responsive */
1457
- @media (max-width: 750px) {
1513
+ .taskon-completed-count {
1514
+ margin-top: var(--taskon-spacing-sm);
1515
+ justify-content: flex-start;
1516
+ }
1517
+
1518
+ @supports (container-type: inline-size) {
1519
+ @container (min-width: 751px) {
1458
1520
  .taskon-task-list-section-header {
1459
- display: block;
1460
- margin-top: 5.6vw;
1461
- margin-bottom: 4vw;
1521
+ display: flex;
1522
+ justify-content: space-between;
1523
+ align-items: center;
1524
+ margin-top: 30px;
1525
+ margin-bottom: 22px;
1462
1526
  }
1463
1527
 
1464
1528
  .taskon-task-list-section-label {
1465
- flex-wrap: wrap;
1466
- gap: 1.6vw;
1529
+ flex-wrap: nowrap;
1530
+ gap: 6px;
1467
1531
  }
1468
1532
 
1469
- .taskon-task-list-section-title {
1470
- font-size: 4.8vw;
1471
- line-height: 6vw;
1533
+ .taskon-completed-count {
1534
+ margin-top: 0;
1472
1535
  }
1473
1536
 
1474
- .taskon-completed-count {
1475
- margin-top: 2.67vw;
1476
- justify-content: flex-start;
1537
+ .taskon-task-list-items {
1538
+ gap: 20px;
1539
+ }
1540
+ }
1541
+ }
1542
+
1543
+ @supports not (container-type: inline-size) {
1544
+ @media (min-width: 751px) {
1545
+ .taskon-task-list-section-header {
1546
+ display: flex;
1547
+ justify-content: space-between;
1548
+ align-items: center;
1549
+ margin-top: 30px;
1550
+ margin-bottom: 22px;
1477
1551
  }
1478
1552
 
1479
- .taskon-completed-count-check {
1480
- width: 3.2vw;
1481
- height: 2.4vw;
1482
- margin-right: 2.13vw;
1553
+ .taskon-task-list-section-label {
1554
+ flex-wrap: nowrap;
1555
+ gap: 6px;
1483
1556
  }
1484
1557
 
1485
- .taskon-completed-count-text {
1486
- font-size: 3.47vw;
1487
- line-height: 4.4vw;
1558
+ .taskon-completed-count {
1559
+ margin-top: 0;
1488
1560
  }
1489
1561
 
1490
1562
  .taskon-task-list-items {
1491
- gap: 3.07vw;
1563
+ gap: 20px;
1564
+ }
1565
+ }
1492
1566
  }
1493
- }
1494
1567
 
1495
1568
  /* ============================================
1496
1569
  TaskProgress Styles
1497
1570
  ============================================ */
1571
+
1498
1572
  .taskon-task-progress {
1499
1573
  display: flex;
1500
1574
  flex-direction: column;
@@ -1504,14 +1578,14 @@
1504
1578
  .taskon-task-progress-bar {
1505
1579
  height: 6px;
1506
1580
  background: var(--taskon-color-bg-surface-strong);
1507
- border-radius: 3px;
1581
+ border-radius: var(--taskon-border-radius-sm);
1508
1582
  overflow: hidden;
1509
1583
  }
1510
1584
 
1511
1585
  .taskon-task-progress-bar-fill {
1512
1586
  height: 100%;
1513
1587
  background: var(--taskon-color-primary);
1514
- border-radius: 3px;
1588
+ border-radius: var(--taskon-border-radius-sm);
1515
1589
  transition: width 0.2s ease;
1516
1590
  }
1517
1591
 
@@ -1540,9 +1614,10 @@
1540
1614
  /* ============================================
1541
1615
  TaskItem Styles
1542
1616
  ============================================ */
1617
+
1543
1618
  .taskon-task-item {
1544
1619
  position: relative;
1545
- padding: 16px 20px;
1620
+ padding: var(--taskon-spacing-md);
1546
1621
  background: var(--taskon-color-bg-surface-subtle);
1547
1622
  border-radius: var(--taskon-border-radius-lg);
1548
1623
  border: 1px solid var(--taskon-color-border-secondary);
@@ -1557,6 +1632,7 @@
1557
1632
  左上角浮标:周期标签 / 冷却倒计时
1558
1633
  与 Vue 版本 RecurrenceStatus.vue 样式一致
1559
1634
  ============================================ */
1635
+
1560
1636
  .taskon-task-item-recurrence {
1561
1637
  position: absolute;
1562
1638
  top: -6px;
@@ -1579,6 +1655,7 @@
1579
1655
  }
1580
1656
 
1581
1657
  /* 冷却倒计时样式 - 继承标签样式 */
1658
+
1582
1659
  .taskon-task-item-recurrence .taskon-cooldown-timer {
1583
1660
  color: var(--taskon-color-primary);
1584
1661
  font-size: 12px;
@@ -1589,12 +1666,15 @@
1589
1666
  /* ============================================
1590
1667
  第一行:图标 + 标题 + 右侧内容
1591
1668
  ============================================ */
1669
+
1592
1670
  .taskon-task-item-row {
1593
1671
  display: flex;
1594
- align-items: center;
1672
+ align-items: flex-start;
1673
+ gap: 8px;
1595
1674
  }
1596
1675
 
1597
1676
  /* Left section: Icon + Title */
1677
+
1598
1678
  .taskon-task-item-left {
1599
1679
  display: flex;
1600
1680
  align-items: center;
@@ -1607,7 +1687,7 @@
1607
1687
  display: flex;
1608
1688
  align-items: center;
1609
1689
  justify-content: center;
1610
- margin-right: 16px;
1690
+ margin-right: 10px;
1611
1691
  color: var(--taskon-color-text-tertiary);
1612
1692
  }
1613
1693
 
@@ -1616,7 +1696,9 @@
1616
1696
  }
1617
1697
 
1618
1698
  /* Title wrapper - 与 Vue 版本 TitleRow 结构一致 */
1699
+
1619
1700
  /* 普通 block flow,标题 inline,TotalEarnPoint 作为 block div 自然换行 */
1701
+
1620
1702
  .taskon-task-item-title-wrap {
1621
1703
  flex: 1;
1622
1704
  min-width: 0;
@@ -1632,6 +1714,7 @@
1632
1714
  }
1633
1715
 
1634
1716
  /* Title as link - 参考 Vue 版本 TitleRow.vue 的 OutLink 样式 */
1717
+
1635
1718
  .taskon-task-item-title--link {
1636
1719
  color: var(--taskon-color-link);
1637
1720
  text-decoration: underline;
@@ -1647,6 +1730,7 @@
1647
1730
  }
1648
1731
 
1649
1732
  /* Links in title - 统一蓝色加下划线样式 */
1733
+
1650
1734
  .taskon-task-item-link {
1651
1735
  color: var(--taskon-color-link);
1652
1736
  text-decoration: underline;
@@ -1658,6 +1742,7 @@
1658
1742
  }
1659
1743
 
1660
1744
  /* Title tip icon */
1745
+
1661
1746
  .taskon-task-item-title-tip {
1662
1747
  display: inline-flex;
1663
1748
  align-items: center;
@@ -1673,15 +1758,18 @@
1673
1758
  }
1674
1759
 
1675
1760
  /* Right section: Points + Total + Verify */
1761
+
1676
1762
  .taskon-task-item-right {
1677
1763
  display: flex;
1678
- align-items: center;
1679
- gap: var(--taskon-spacing-md);
1764
+ flex-direction: column;
1765
+ align-items: flex-end;
1766
+ gap: 6px;
1680
1767
  flex-shrink: 0;
1681
- margin-left: 10px;
1768
+ margin-left: 8px;
1682
1769
  }
1683
1770
 
1684
1771
  /* Points display - 参考 TaskPoint.vue */
1772
+
1685
1773
  .taskon-task-item-points {
1686
1774
  min-width: 40px;
1687
1775
  height: 34px;
@@ -1691,7 +1779,7 @@
1691
1779
  justify-content: center;
1692
1780
  gap: 2px;
1693
1781
  background: var(--taskon-color-bg-surface-subtle);
1694
- border-radius: 6px;
1782
+ border-radius: var(--taskon-border-radius-sm);
1695
1783
  font-size: 16px;
1696
1784
  font-weight: 500;
1697
1785
  }
@@ -1701,6 +1789,7 @@
1701
1789
  }
1702
1790
 
1703
1791
  /* Points value when task is completed - green color like Vue version */
1792
+
1704
1793
  .taskon-task-item-points-value--completed {
1705
1794
  color: var(--taskon-color-secondary);
1706
1795
  }
@@ -1711,11 +1800,13 @@
1711
1800
  }
1712
1801
 
1713
1802
  /* Tip icon next to points (margin controlled externally) */
1803
+
1714
1804
  .taskon-task-item-tip {
1715
1805
  margin-left: 10px;
1716
1806
  }
1717
1807
 
1718
1808
  /* Total points */
1809
+
1719
1810
  .taskon-task-item-total-points {
1720
1811
  font-size: 12px;
1721
1812
  color: var(--taskon-color-text-disabled);
@@ -1725,6 +1816,7 @@
1725
1816
  TotalEarnPoint Styles
1726
1817
  与 Vue 版本 TotalEarnPoint.vue 样式一致
1727
1818
  ============================================ */
1819
+
1728
1820
  .taskon-task-item-total-earn {
1729
1821
  display: flex;
1730
1822
  align-items: center;
@@ -1744,8 +1836,9 @@
1744
1836
  /* ============================================
1745
1837
  第二行:内容区域(始终显示)
1746
1838
  ============================================ */
1839
+
1747
1840
  .taskon-task-item-body {
1748
- margin-left: 50px;
1841
+ margin-left: 36px;
1749
1842
  margin-top: 10px;
1750
1843
  }
1751
1844
 
@@ -1764,6 +1857,7 @@
1764
1857
  }
1765
1858
 
1766
1859
  /* Description fields */
1860
+
1767
1861
  .taskon-task-item-fields {
1768
1862
  display: flex;
1769
1863
  flex-direction: column;
@@ -1798,6 +1892,7 @@
1798
1892
  }
1799
1893
 
1800
1894
  /* Action link */
1895
+
1801
1896
  .taskon-task-item-action-link {
1802
1897
  display: inline-flex;
1803
1898
  align-items: center;
@@ -1819,6 +1914,7 @@
1819
1914
  }
1820
1915
 
1821
1916
  /* Spinner animation */
1917
+
1822
1918
  @keyframes taskon-spin {
1823
1919
  from {
1824
1920
  transform: rotate(0deg);
@@ -1835,6 +1931,7 @@
1835
1931
  /* ============================================
1836
1932
  TaskIcon Styles
1837
1933
  ============================================ */
1934
+
1838
1935
  .taskon-task-icon {
1839
1936
  display: inline-flex;
1840
1937
  align-items: center;
@@ -1850,6 +1947,7 @@
1850
1947
  /* ============================================
1851
1948
  CooldownTimer Styles
1852
1949
  ============================================ */
1950
+
1853
1951
  .taskon-cooldown-timer {
1854
1952
  display: inline-flex;
1855
1953
  align-items: center;
@@ -1861,6 +1959,7 @@
1861
1959
  /* ============================================
1862
1960
  VerifyButton Styles
1863
1961
  ============================================ */
1962
+
1864
1963
  .taskon-verify-btn {
1865
1964
  display: inline-flex;
1866
1965
  align-items: center;
@@ -1903,6 +2002,7 @@
1903
2002
  /* ============================================
1904
2003
  ExpandableContent Styles
1905
2004
  ============================================ */
2005
+
1906
2006
  .taskon-expandable {
1907
2007
  display: flex;
1908
2008
  flex-direction: column;
@@ -1946,59 +2046,70 @@
1946
2046
  }
1947
2047
 
1948
2048
  /* ============================================
1949
- Responsive Styles
2049
+ Desktop 增强
1950
2050
  ============================================ */
1951
- @media (max-width: 750px) {
2051
+
2052
+ @supports (container-type: inline-size) {
2053
+ @container (min-width: 751px) {
1952
2054
  .taskon-task-item {
1953
- padding: 4vw;
2055
+ padding: 16px 20px;
2056
+ }
2057
+
2058
+ .taskon-task-item-row {
2059
+ align-items: center;
2060
+ gap: 0;
1954
2061
  }
1955
2062
 
1956
2063
  .taskon-task-item-body {
1957
- margin-left: 9.333vw;
2064
+ margin-left: 50px;
1958
2065
  }
1959
2066
 
1960
2067
  .taskon-task-item-icon {
1961
- margin-right: 2.667vw;
2068
+ margin-right: 16px;
1962
2069
  }
1963
2070
 
1964
2071
  .taskon-task-item-right {
1965
- margin-left: 2.67vw;
2072
+ flex-direction: row;
2073
+ align-items: center;
2074
+ gap: 6px;
2075
+ margin-left: 8px;
2076
+ }
2077
+ }
1966
2078
  }
1967
2079
 
1968
- .taskon-task-item-title {
1969
- font-weight: 400;
1970
- font-size: 3.733vw;
1971
- line-height: 4.667vw;
2080
+ @supports not (container-type: inline-size) {
2081
+ @media (min-width: 751px) {
2082
+ .taskon-task-item {
2083
+ padding: 16px 20px;
1972
2084
  }
1973
2085
 
1974
- .taskon-task-item-desc {
1975
- font-size: 3.2vw;
1976
- line-height: 4vw;
2086
+ .taskon-task-item-row {
2087
+ align-items: center;
2088
+ gap: 0;
1977
2089
  }
1978
2090
 
1979
- .taskon-task-icon-img {
1980
- width: 6.667vw !important;
1981
- height: 6.667vw !important;
2091
+ .taskon-task-item-body {
2092
+ margin-left: 50px;
1982
2093
  }
1983
2094
 
1984
- /* Points display mobile - 参考 TaskPoint.vue */
1985
- .taskon-task-item-points {
1986
- min-width: 6.8vw;
1987
- height: 6.67vw;
1988
- padding: 0 2vw;
1989
- font-size: 2.93vw;
1990
- border-radius: 0.91vw;
2095
+ .taskon-task-item-icon {
2096
+ margin-right: 16px;
1991
2097
  }
1992
2098
 
1993
- .taskon-task-item-points-time {
1994
- font-size: 1.85vw;
2099
+ .taskon-task-item-right {
2100
+ flex-direction: row;
2101
+ align-items: center;
2102
+ gap: 6px;
2103
+ margin-left: 8px;
2104
+ }
2105
+ }
1995
2106
  }
1996
- }
1997
2107
 
1998
2108
  /* ============================================
1999
2109
  TimeRange Styles
2000
2110
  与 Vue 版本 TimeRange.vue 样式一致
2001
2111
  ============================================ */
2112
+
2002
2113
  .taskon-task-time-range {
2003
2114
  font-size: 14px;
2004
2115
  line-height: 18px;
@@ -2018,6 +2129,7 @@
2018
2129
  VerifyButton Cooldown Progress Bar
2019
2130
  与 Vue 版本 VerifyButton.vue 冷却进度条样式一致
2020
2131
  ============================================ */
2132
+
2021
2133
  .taskon-verify-btn-wrap {
2022
2134
  position: relative;
2023
2135
  display: inline-block;
@@ -2072,20 +2184,34 @@
2072
2184
  * Migrated from Vue version with Tailwind classes converted to CSS
2073
2185
  */
2074
2186
 
2187
+ /*
2188
+ * Responsive base styles
2189
+ *
2190
+ * Keep mobile breakpoints and fallback patterns centralized here.
2191
+ * Components should reuse these mixins instead of duplicating query logic.
2192
+ */
2193
+
2194
+ /*
2195
+ * Desktop-up mixin:
2196
+ * 1) Enable desktop enhancement in wider containers
2197
+ * 2) Keep viewport media query as fallback
2198
+ */
2199
+
2075
2200
  /* ============================================================================
2076
2201
  BlindBox Dialog - 开盲盒交互弹窗
2077
2202
  ============================================================================ */
2078
2203
 
2079
2204
  .taskon-quest-blindbox-dialog {
2205
+ container-type: inline-size;
2080
2206
  position: relative;
2081
2207
  width: min(520px, 92vw);
2082
2208
  overflow: hidden;
2083
- padding-top: 40px;
2209
+ padding-top: var(--taskon-spacing-lg);
2084
2210
  }
2085
2211
 
2086
2212
  .taskon-quest-blindbox-dialog-title {
2087
- margin: 0 0 16px;
2088
- padding: 0 40px;
2213
+ margin: 0 0 var(--taskon-spacing-md);
2214
+ padding: 0 var(--taskon-spacing-lg);
2089
2215
  font-size: 22px;
2090
2216
  font-weight: 600;
2091
2217
  line-height: 1.4;
@@ -2093,6 +2219,7 @@
2093
2219
  }
2094
2220
 
2095
2221
  /* Stage container - centered square area for animation */
2222
+
2096
2223
  .taskon-quest-blindbox-stage {
2097
2224
  position: relative;
2098
2225
  display: flex;
@@ -2108,6 +2235,7 @@
2108
2235
  }
2109
2236
 
2110
2237
  /* Background spinning light */
2238
+
2111
2239
  .taskon-quest-blindbox-bg {
2112
2240
  position: absolute;
2113
2241
  left: 50%;
@@ -2134,6 +2262,7 @@
2134
2262
  }
2135
2263
 
2136
2264
  /* Drop zone - collision detection area */
2265
+
2137
2266
  .taskon-quest-blindbox-dropzone {
2138
2267
  position: absolute;
2139
2268
  left: 50%;
@@ -2145,6 +2274,7 @@
2145
2274
  }
2146
2275
 
2147
2276
  /* Chest container */
2277
+
2148
2278
  .taskon-quest-blindbox-chest {
2149
2279
  position: absolute;
2150
2280
  left: 50%;
@@ -2165,15 +2295,17 @@
2165
2295
  }
2166
2296
 
2167
2297
  /* Ensure Lottie SVG fills container */
2298
+
2168
2299
  .taskon-quest-blindbox-chest svg {
2169
2300
  width: 100% !important;
2170
2301
  height: auto !important;
2171
2302
  }
2172
2303
 
2173
2304
  /* Key image */
2305
+
2174
2306
  .taskon-quest-blindbox-key {
2175
2307
  position: absolute;
2176
- width: clamp(80px, 16vw, 100px);
2308
+ width: clamp(80px, 25%, 100px);
2177
2309
  transform: translate(-50%, -50%);
2178
2310
  cursor: grab;
2179
2311
  touch-action: none;
@@ -2201,16 +2333,18 @@
2201
2333
  ============================================================================ */
2202
2334
 
2203
2335
  .taskon-quest-blindbox-reward {
2336
+ container-type: inline-size;
2204
2337
  position: relative;
2205
2338
  width: 510px;
2206
2339
  max-width: 92vw;
2207
- padding: 64px 40px;
2340
+ padding: 48px var(--taskon-spacing-lg);
2208
2341
  text-align: center;
2209
2342
  color: #fff;
2210
2343
  overflow: hidden;
2211
2344
  }
2212
2345
 
2213
2346
  /* Light background effect */
2347
+
2214
2348
  .taskon-quest-blindbox-reward-light {
2215
2349
  position: absolute;
2216
2350
  top: 0;
@@ -2231,6 +2365,7 @@
2231
2365
  }
2232
2366
 
2233
2367
  /* Title */
2368
+
2234
2369
  .taskon-quest-blindbox-reward-title {
2235
2370
  font-size: 32px;
2236
2371
  font-weight: 600;
@@ -2239,6 +2374,7 @@
2239
2374
  }
2240
2375
 
2241
2376
  /* Subtitle */
2377
+
2242
2378
  .taskon-quest-blindbox-reward-subtitle {
2243
2379
  margin-top: 12px;
2244
2380
  font-size: 16px;
@@ -2247,31 +2383,33 @@
2247
2383
  }
2248
2384
 
2249
2385
  /* Rewards container - Green border and background like Vue version */
2386
+
2250
2387
  .taskon-quest-blindbox-reward-list {
2251
2388
  display: inline-flex;
2252
2389
  flex-wrap: wrap;
2253
2390
  justify-content: center;
2254
2391
  align-items: center;
2255
- margin-top: 24px;
2256
- gap: 8px;
2257
- padding: 12px 16px;
2258
- border-radius: 8px;
2392
+ margin-top: var(--taskon-spacing-lg);
2393
+ gap: var(--taskon-spacing-sm);
2394
+ padding: 12px var(--taskon-spacing-md);
2395
+ border-radius: var(--taskon-border-radius);
2259
2396
  border: 1px solid rgba(60, 232, 155, 0.2);
2260
2397
  background: rgba(0, 255, 163, 0.1);
2261
2398
  }
2262
2399
 
2263
2400
  /* Single reward card - transparent background */
2401
+
2264
2402
  .taskon-quest-blindbox-reward-card {
2265
2403
  display: flex;
2266
2404
  flex-direction: column;
2267
2405
  align-items: center;
2268
2406
  justify-content: center;
2269
- padding: 12px 16px;
2407
+ padding: 12px var(--taskon-spacing-md);
2270
2408
  background: transparent;
2271
2409
  border-radius: 0;
2272
2410
  min-width: 60px;
2273
2411
  min-height: 80px;
2274
- gap: 8px;
2412
+ gap: var(--taskon-spacing-sm);
2275
2413
  }
2276
2414
 
2277
2415
  .taskon-quest-blindbox-reward-card-icon {
@@ -2282,6 +2420,7 @@
2282
2420
  }
2283
2421
 
2284
2422
  /* Token amount with orange color and underline like Vue version */
2423
+
2285
2424
  .taskon-quest-blindbox-reward-card-amount {
2286
2425
  font-size: 18px;
2287
2426
  font-weight: 600;
@@ -2302,13 +2441,15 @@
2302
2441
  }
2303
2442
 
2304
2443
  /* Back button */
2444
+
2305
2445
  .taskon-quest-blindbox-reward-btn-wrap {
2306
2446
  display: flex;
2307
2447
  justify-content: center;
2308
- margin-top: 60px;
2448
+ margin-top: 40px;
2309
2449
  }
2310
2450
 
2311
2451
  /* Back button - matches Vue g-button--light-border */
2452
+
2312
2453
  .taskon-quest-blindbox-reward-btn {
2313
2454
  height: 36px;
2314
2455
  padding: 0 24px;
@@ -2317,7 +2458,7 @@
2317
2458
  color: #fff;
2318
2459
  background: transparent;
2319
2460
  border: 1px solid #fff;
2320
- border-radius: 8px;
2461
+ border-radius: var(--taskon-border-radius);
2321
2462
  cursor: pointer;
2322
2463
  transition: opacity 0.2s ease;
2323
2464
  }
@@ -2347,7 +2488,7 @@
2347
2488
  color: #000;
2348
2489
  background: linear-gradient(135deg, #ffd700 0%, #ffaa00 100%);
2349
2490
  border: none;
2350
- border-radius: 12px;
2491
+ border-radius: var(--taskon-border-radius-lg);
2351
2492
  cursor: pointer;
2352
2493
  transition: all 0.2s ease;
2353
2494
  }
@@ -2366,50 +2507,77 @@
2366
2507
  height: 24px;
2367
2508
  }
2368
2509
 
2369
- /* ============================================================================
2370
- Mobile Responsive
2371
- ============================================================================ */
2372
-
2373
- @media (max-width: 768px) {
2510
+ @supports (container-type: inline-size) {
2511
+ @container (min-width: 751px) {
2374
2512
  .taskon-quest-blindbox-dialog {
2375
- padding-top: 24px;
2513
+ padding-top: 40px;
2376
2514
  }
2377
2515
 
2378
2516
  .taskon-quest-blindbox-dialog-title {
2379
- padding: 0 24px;
2380
- font-size: 18px;
2517
+ padding: 0 40px;
2381
2518
  }
2382
2519
 
2383
2520
  .taskon-quest-blindbox-reward {
2384
- padding: 48px 24px;
2521
+ padding: 64px 40px;
2522
+ }
2523
+
2524
+ .taskon-quest-blindbox-reward-btn-wrap {
2525
+ margin-top: 60px;
2526
+ }
2527
+ }
2528
+ }
2529
+
2530
+ @supports not (container-type: inline-size) {
2531
+ @media (min-width: 751px) {
2532
+ .taskon-quest-blindbox-dialog {
2533
+ padding-top: 40px;
2385
2534
  }
2386
2535
 
2387
- .taskon-quest-blindbox-reward-title {
2388
- font-size: 24px;
2389
- line-height: 32px;
2536
+ .taskon-quest-blindbox-dialog-title {
2537
+ padding: 0 40px;
2538
+ }
2539
+
2540
+ .taskon-quest-blindbox-reward {
2541
+ padding: 64px 40px;
2390
2542
  }
2391
2543
 
2392
2544
  .taskon-quest-blindbox-reward-btn-wrap {
2393
- margin-top: 40px;
2545
+ margin-top: 60px;
2546
+ }
2547
+ }
2394
2548
  }
2395
- }
2396
2549
  /**
2397
2550
  * Eligibility (资格验证) 组件样式
2398
2551
  * @description Standalone CSS for EligibilityInfo component, usable in any widget context.
2399
2552
  */
2400
2553
 
2554
+ /*
2555
+ * Responsive base styles
2556
+ *
2557
+ * Keep mobile breakpoints and fallback patterns centralized here.
2558
+ * Components should reuse these mixins instead of duplicating query logic.
2559
+ */
2560
+
2561
+ /*
2562
+ * Desktop-up mixin:
2563
+ * 1) Enable desktop enhancement in wider containers
2564
+ * 2) Keep viewport media query as fallback
2565
+ */
2566
+
2401
2567
  /* ============================================================================
2402
2568
  Eligibility 主容器
2403
2569
  ============================================================================ */
2404
2570
 
2405
2571
  .taskon-quest-eligs {
2406
- margin-top: 25px;
2407
- padding: 0 18px;
2572
+ container-type: inline-size;
2573
+ margin-top: var(--taskon-spacing-md);
2574
+ padding: 0 var(--taskon-spacing-md);
2408
2575
  border: 1px solid var(--taskon-color-border);
2409
- border-radius: 10px;
2576
+ border-radius: var(--taskon-border-radius-lg);
2410
2577
  }
2411
2578
 
2412
2579
  /* 动画效果 - 用于引导用户注意 */
2580
+
2413
2581
  .taskon-quest-eligs--animate {
2414
2582
  animation: taskon-quest-eligs-glow 800ms ease-out infinite alternate;
2415
2583
  }
@@ -2443,17 +2611,20 @@
2443
2611
  }
2444
2612
 
2445
2613
  /* 状态图标 */
2614
+
2446
2615
  .taskon-quest-eligs-header-status {
2447
2616
  flex-shrink: 0;
2448
2617
  }
2449
2618
 
2450
2619
  /* 头部文本 */
2620
+
2451
2621
  .taskon-quest-eligs-header-text {
2452
2622
  flex: 1;
2453
2623
  color: var(--taskon-color-text);
2454
2624
  }
2455
2625
 
2456
2626
  /* 高亮表达式 (all/any) */
2627
+
2457
2628
  .taskon-quest-eligs-header-express {
2458
2629
  color: var(--taskon-color-secondary);
2459
2630
  }
@@ -2472,7 +2643,7 @@
2472
2643
  margin-left: auto;
2473
2644
  background: transparent;
2474
2645
  border: 1px solid var(--taskon-color-border);
2475
- border-radius: 6px;
2646
+ border-radius: var(--taskon-border-radius-sm);
2476
2647
  color: var(--taskon-color-text-secondary);
2477
2648
  cursor: pointer;
2478
2649
  transition: all 0.2s;
@@ -2521,19 +2692,20 @@
2521
2692
 
2522
2693
  .taskon-quest-eligs-list {
2523
2694
  text-align: left;
2524
- padding: 20px 0;
2695
+ padding: var(--taskon-spacing-md) 0;
2525
2696
  margin: 0;
2526
2697
  list-style: none;
2527
2698
  border-top: 1px solid var(--taskon-color-border);
2528
2699
  }
2529
2700
 
2530
2701
  /* 单项 */
2702
+
2531
2703
  .taskon-quest-eligs-item {
2532
2704
  line-height: 18px;
2533
2705
  }
2534
2706
 
2535
2707
  .taskon-quest-eligs-item + .taskon-quest-eligs-item {
2536
- margin-top: 24px;
2708
+ margin-top: var(--taskon-spacing-md);
2537
2709
  }
2538
2710
 
2539
2711
  .taskon-quest-eligs-item-container {
@@ -2542,10 +2714,11 @@
2542
2714
  }
2543
2715
 
2544
2716
  /* 状态图标 */
2717
+
2545
2718
  .taskon-quest-eligs-item-icon {
2546
2719
  flex-shrink: 0;
2547
- margin-right: 10px;
2548
- margin-top: 2px;
2720
+ margin-right: var(--taskon-spacing-sm);
2721
+ margin-top: var(--taskon-spacing-xs);
2549
2722
  opacity: 0;
2550
2723
  }
2551
2724
 
@@ -2553,8 +2726,8 @@
2553
2726
  flex-shrink: 0;
2554
2727
  width: 16px;
2555
2728
  height: 16px;
2556
- margin-right: 10px;
2557
- margin-top: 2px;
2729
+ margin-right: var(--taskon-spacing-sm);
2730
+ margin-top: var(--taskon-spacing-xs);
2558
2731
  }
2559
2732
 
2560
2733
  .taskon-quest-eligs-item--passed .taskon-quest-eligs-item-icon,
@@ -2579,6 +2752,7 @@
2579
2752
  }
2580
2753
 
2581
2754
  /* 内容区 */
2755
+
2582
2756
  .taskon-quest-eligs-item-content {
2583
2757
  flex: 1;
2584
2758
  font-size: 14px;
@@ -2600,11 +2774,13 @@
2600
2774
  }
2601
2775
 
2602
2776
  /* 高亮文本 */
2777
+
2603
2778
  .taskon-quest-eligs-highlight {
2604
2779
  color: var(--taskon-color-primary);
2605
2780
  }
2606
2781
 
2607
2782
  /* 链接样式 */
2783
+
2608
2784
  .taskon-quest-eligs-link {
2609
2785
  color: var(--taskon-color-link);
2610
2786
  text-decoration: underline;
@@ -2615,6 +2791,7 @@
2615
2791
  }
2616
2792
 
2617
2793
  /* Tooltip */
2794
+
2618
2795
  .taskon-quest-eligs-tooltip {
2619
2796
  position: absolute;
2620
2797
  top: 100%;
@@ -2627,7 +2804,7 @@
2627
2804
  line-height: 16px;
2628
2805
  color: var(--taskon-color-text);
2629
2806
  background-color: var(--taskon-color-bg-floating);
2630
- border-radius: 6px;
2807
+ border-radius: var(--taskon-border-radius-sm);
2631
2808
  box-shadow: 0 2px 8px var(--taskon-color-bg-mask);
2632
2809
  white-space: normal;
2633
2810
  word-break: break-word;
@@ -2685,48 +2862,51 @@
2685
2862
  color: var(--taskon-color-text-secondary);
2686
2863
  }
2687
2864
 
2688
- /* ============================================================================
2689
- Eligibility 响应式样式
2690
- ============================================================================ */
2691
-
2692
- @media (max-width: 750px) {
2865
+ @supports (container-type: inline-size) {
2866
+ @container (min-width: 751px) {
2693
2867
  .taskon-quest-eligs {
2694
- margin-top: 5.07vw;
2695
- padding: 0 4vw;
2868
+ margin-top: var(--taskon-spacing-lg);
2869
+ padding: 0 var(--taskon-spacing-md);
2696
2870
  }
2697
2871
 
2698
- .taskon-quest-eligs-header {
2699
- height: 12vw;
2700
- font-size: 3.47vw;
2701
- line-height: 4.4vw;
2872
+ .taskon-quest-eligs-list {
2873
+ padding: 20px 0;
2702
2874
  }
2703
2875
 
2704
- .taskon-quest-eligs-header-arrow {
2705
- width: 1.2vw;
2706
- height: 2.4vw;
2876
+ .taskon-quest-eligs-item + .taskon-quest-eligs-item {
2877
+ margin-top: var(--taskon-spacing-lg);
2878
+ }
2879
+
2880
+ .taskon-quest-eligs-item-icon,
2881
+ .taskon-quest-eligs-item-icon-placeholder {
2882
+ margin-top: var(--taskon-spacing-xs);
2883
+ margin-right: var(--taskon-spacing-sm);
2884
+ }
2885
+ }
2886
+ }
2887
+
2888
+ @supports not (container-type: inline-size) {
2889
+ @media (min-width: 751px) {
2890
+ .taskon-quest-eligs {
2891
+ margin-top: var(--taskon-spacing-lg);
2892
+ padding: 0 var(--taskon-spacing-md);
2707
2893
  }
2708
2894
 
2709
2895
  .taskon-quest-eligs-list {
2710
- padding: 3.73vw 0;
2896
+ padding: 20px 0;
2711
2897
  }
2712
2898
 
2713
2899
  .taskon-quest-eligs-item + .taskon-quest-eligs-item {
2714
- margin-top: 3.73vw;
2900
+ margin-top: var(--taskon-spacing-lg);
2715
2901
  }
2716
2902
 
2717
2903
  .taskon-quest-eligs-item-icon,
2718
2904
  .taskon-quest-eligs-item-icon-placeholder {
2719
- margin-top: 0.8vw;
2720
- margin-right: 1.87vw;
2721
- width: 3.2vw;
2722
- height: 3.2vw;
2905
+ margin-top: var(--taskon-spacing-xs);
2906
+ margin-right: var(--taskon-spacing-sm);
2723
2907
  }
2724
-
2725
- .taskon-quest-eligs-item-content {
2726
- font-size: 3.47vw;
2727
- line-height: 4.4vw;
2908
+ }
2728
2909
  }
2729
- }
2730
2910
 
2731
2911
  /* ============================================================================
2732
2912
  OnChainVerify Tooltip Styles