@taskon/widget-react 0.0.1

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 (37) hide show
  1. package/README.md +1064 -0
  2. package/dist/CommunityTaskList.css +5010 -0
  3. package/dist/EligibilityInfo.css +1966 -0
  4. package/dist/LeaderboardWidget.css +815 -0
  5. package/dist/Quest.css +4584 -0
  6. package/dist/Table.css +389 -0
  7. package/dist/TaskOnProvider.css +163 -0
  8. package/dist/WidgetShell.css +182 -0
  9. package/dist/chunks/CommunityTaskList-CrH6r4Av.js +6886 -0
  10. package/dist/chunks/EligibilityInfo-DesW9-k9.js +24900 -0
  11. package/dist/chunks/LeaderboardWidget-BSGpHKTk.js +1156 -0
  12. package/dist/chunks/Quest-uSIVq78I.js +8581 -0
  13. package/dist/chunks/Table-CWGf2FKV.js +449 -0
  14. package/dist/chunks/TaskOnProvider-QMwxGL44.js +1435 -0
  15. package/dist/chunks/ThemeProvider-Cs8IUVQj.js +1118 -0
  16. package/dist/chunks/WidgetShell-NlOgn1x5.js +1517 -0
  17. package/dist/chunks/common-ja-DWhTaFHb.js +23 -0
  18. package/dist/chunks/common-ko-80ezXsMG.js +23 -0
  19. package/dist/chunks/index-CwMvO_wZ.js +777 -0
  20. package/dist/chunks/leaderboardwidget-ja-Bj6gz6y1.js +119 -0
  21. package/dist/chunks/leaderboardwidget-ko-f1cLO9ic.js +119 -0
  22. package/dist/chunks/useToast-BGJhd3BX.js +93 -0
  23. package/dist/chunks/useWidgetLocale-BVcopbZS.js +74 -0
  24. package/dist/chunks/usercenter-ja-DBj_dtuz.js +329 -0
  25. package/dist/chunks/usercenter-ko-DYTkHAld.js +329 -0
  26. package/dist/community-task.d.ts +451 -0
  27. package/dist/community-task.js +9 -0
  28. package/dist/core.d.ts +803 -0
  29. package/dist/core.js +22 -0
  30. package/dist/index.css +3662 -0
  31. package/dist/index.d.ts +1627 -0
  32. package/dist/index.js +7372 -0
  33. package/dist/leaderboard.d.ts +547 -0
  34. package/dist/leaderboard.js +17 -0
  35. package/dist/quest.d.ts +389 -0
  36. package/dist/quest.js +8 -0
  37. package/package.json +97 -0
package/dist/Table.css ADDED
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Pagination 通用分页组件样式
3
+ * @description 使用 taskon-pagination 命名空间
4
+ *
5
+ * 设计参考 Figma: node-id=4000-1995
6
+ * - 按钮: 30x30px 圆形
7
+ * - 页码: 16px Regular
8
+ * - 当前页: 白色
9
+ * - 分隔符+总页数: rgba(255,255,255,0.4)
10
+ */
11
+
12
+ /* ==================== 容器 ==================== */
13
+ .taskon-pagination {
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ width: 100%;
18
+ gap: 16px;
19
+ padding: 12px 0;
20
+ }
21
+
22
+ /* ==================== 范围信息 ==================== */
23
+ .taskon-pagination-range {
24
+ font-size: 14px;
25
+ color: var(--taskon-color-text-secondary, rgba(255, 255, 255, 0.4));
26
+ }
27
+
28
+ /* ==================== 控制区 ==================== */
29
+ .taskon-pagination-controls {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 16px;
33
+ }
34
+
35
+ /* ==================== 页码信息 - 基于 Figma 设计 ==================== */
36
+ .taskon-pagination-info {
37
+ display: flex;
38
+ align-items: center;
39
+ font-size: 16px;
40
+ font-weight: 400;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ /* 当前页码 - 白色 */
45
+ .taskon-pagination-info-current {
46
+ color: var(--taskon-color-text-lightest, #ffffff);
47
+ }
48
+
49
+ /* 分隔符 - 灰色 */
50
+ .taskon-pagination-info-separator {
51
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
52
+ }
53
+
54
+ /* 总页数 - 灰色 */
55
+ .taskon-pagination-info-total {
56
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
57
+ }
58
+
59
+ /* ==================== 图标 ==================== */
60
+ .taskon-pagination-icon {
61
+ width: 16px;
62
+ height: 16px;
63
+ }
64
+
65
+ /* ==================== 按钮样式 - 圆形按钮 ==================== */
66
+ .taskon-pagination-btn {
67
+ display: inline-flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ width: 30px;
71
+ height: 30px;
72
+ min-width: 30px !important;
73
+ padding: 0 !important;
74
+ border-radius: 50% !important;
75
+ background-color: transparent !important;
76
+ border: 1px solid var(--taskon-color-border, rgba(255, 255, 255, 0.1)) !important;
77
+ color: var(--taskon-color-text-lightest, #ffffff) !important;
78
+ transition: all 0.2s ease;
79
+ }
80
+
81
+ .taskon-pagination-btn:hover:not(:disabled) {
82
+ background-color: var(--taskon-color-bg-hover, rgba(255, 255, 255, 0.04)) !important;
83
+ border-color: var(--taskon-color-border-hover, rgba(255, 255, 255, 0.2)) !important;
84
+ }
85
+
86
+ .taskon-pagination-btn:disabled {
87
+ opacity: 0.4;
88
+ cursor: not-allowed;
89
+ }
90
+
91
+ /* ==================== 尺寸变体 ==================== */
92
+ .taskon-pagination--small .taskon-pagination-range {
93
+ font-size: 12px;
94
+ }
95
+
96
+ .taskon-pagination--small .taskon-pagination-info {
97
+ font-size: 14px;
98
+ }
99
+
100
+ .taskon-pagination--small .taskon-pagination-icon {
101
+ width: 14px;
102
+ height: 14px;
103
+ }
104
+
105
+ .taskon-pagination--small .taskon-pagination-btn {
106
+ width: 24px;
107
+ height: 24px;
108
+ min-width: 24px !important;
109
+ }
110
+
111
+ /* ==================== 响应式 ==================== */
112
+ @media (max-width: 750px) {
113
+ .taskon-pagination {
114
+ gap: 12px;
115
+ }
116
+
117
+ .taskon-pagination-range {
118
+ font-size: 3.2vw;
119
+ }
120
+
121
+ .taskon-pagination-info {
122
+ font-size: 14px;
123
+ }
124
+ }
125
+ /**
126
+ * Table 通用表格组件样式
127
+ *
128
+ * 采用 BEM 命名规范
129
+ * 前缀: taskon-table
130
+ *
131
+ * 设计参考 Figma: node-id=4000-1908
132
+ * - 表头: 半透明背景、圆角、暗色文字
133
+ * - 行: 边框分隔、悬停效果、交替背景
134
+ * - 单元格: 可配置宽度和对齐方式
135
+ */
136
+
137
+ /* ============================================================================
138
+ 容器
139
+ ============================================================================ */
140
+
141
+ .taskon-table-container {
142
+ width: 100%;
143
+ overflow-x: auto;
144
+ position: relative;
145
+ }
146
+
147
+ .taskon-table {
148
+ width: 100%;
149
+ border-collapse: separate;
150
+ border-spacing: 0;
151
+ }
152
+
153
+ /* ============================================================================
154
+ 表头 - 参考 Figma 设计:45px 高度,深色半透明背景,无圆角
155
+ ============================================================================ */
156
+
157
+ .taskon-table__head {
158
+ /* 不在 thead 上设置背景,由 th 元素控制 */
159
+ }
160
+
161
+ .taskon-table__head tr {
162
+ height: 45px;
163
+ }
164
+
165
+ /* 表头单元格 - 16px Regular,深色半透明背景 */
166
+ .taskon-table__header {
167
+ padding: 10px 20px;
168
+ font-size: 16px;
169
+ font-weight: 400;
170
+ text-align: left;
171
+ line-height: 24px;
172
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
173
+ white-space: nowrap;
174
+ vertical-align: middle;
175
+ background-color: var(--taskon-color-table-header-bg, rgba(255, 255, 255, 0.04));
176
+ }
177
+
178
+ /* 表头对齐方式 */
179
+ .taskon-table__header--left {
180
+ text-align: left;
181
+ }
182
+
183
+ .taskon-table__header--center {
184
+ text-align: center;
185
+ }
186
+
187
+ .taskon-table__header--right {
188
+ text-align: right;
189
+ }
190
+
191
+ /* ============================================================================
192
+ 表体
193
+ ============================================================================ */
194
+
195
+ .taskon-table__body {
196
+ /* 默认样式 */
197
+ }
198
+
199
+ /* ============================================================================
200
+ 数据行 - 参考 Figma 设计:更大行高(76px),无边框
201
+ ============================================================================ */
202
+
203
+ .taskon-table__row {
204
+ transition: background-color 0.2s ease;
205
+ height: 76px;
206
+ }
207
+
208
+ /* 行边框 - 默认不显示,使用 borderless 类控制 */
209
+ .taskon-table__row td {
210
+ border-top: none;
211
+ border-bottom: none;
212
+ }
213
+
214
+ /* 需要边框时的样式 */
215
+ .taskon-table--bordered .taskon-table__row td {
216
+ border-top: 1px solid var(--taskon-color-table-border, rgba(255, 255, 255, 0.04));
217
+ border-bottom: 1px solid var(--taskon-color-table-border, rgba(255, 255, 255, 0.04));
218
+ }
219
+
220
+ /* 悬停效果 */
221
+ .taskon-table__row:hover {
222
+ background-color: var(--taskon-color-table-row-hover, rgba(255, 255, 255, 0.04));
223
+ }
224
+
225
+ /* 交替行背景 (striped) */
226
+ .taskon-table--striped .taskon-table__row:nth-child(even) {
227
+ background-color: var(--taskon-color-table-row-alt, rgba(255, 255, 255, 0.04));
228
+ }
229
+
230
+ /* 高亮行 */
231
+ .taskon-table__row--highlighted {
232
+ background-color: var(--taskon-color-primary-bg, rgba(99, 102, 241, 0.1));
233
+ }
234
+
235
+ .taskon-table__row--highlighted:hover {
236
+ background-color: var(--taskon-color-primary-bg-hover, rgba(99, 102, 241, 0.15));
237
+ }
238
+
239
+ /* 禁用行 */
240
+ .taskon-table__row--disabled {
241
+ opacity: 0.4;
242
+ }
243
+
244
+ /* 可点击行 */
245
+ .taskon-table__row--clickable {
246
+ cursor: pointer;
247
+ }
248
+
249
+ /* ============================================================================
250
+ 单元格 - 参考 Figma 设计:16px SemiBold,白色文字
251
+ ============================================================================ */
252
+
253
+ .taskon-table__cell {
254
+ padding: 16px 20px;
255
+ font-size: 16px;
256
+ font-weight: 600;
257
+ line-height: 24px;
258
+ color: var(--taskon-color-text-lightest, #ffffff);
259
+ vertical-align: middle;
260
+ }
261
+
262
+ /* 单元格对齐方式 */
263
+ .taskon-table__cell--left {
264
+ text-align: left;
265
+ }
266
+
267
+ .taskon-table__cell--center {
268
+ text-align: center;
269
+ }
270
+
271
+ .taskon-table__cell--right {
272
+ text-align: right;
273
+ }
274
+
275
+ /* 单元格文本溢出 */
276
+ .taskon-table__cell--ellipsis {
277
+ text-overflow: ellipsis;
278
+ overflow: hidden;
279
+ white-space: nowrap;
280
+ }
281
+
282
+ /* ============================================================================
283
+ 空状态和加载状态
284
+ ============================================================================ */
285
+
286
+ .taskon-table__loading,
287
+ .taskon-table__empty {
288
+ padding: 40px 16px;
289
+ text-align: center;
290
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
291
+ }
292
+
293
+ .taskon-table__empty-content {
294
+ display: flex;
295
+ flex-direction: column;
296
+ align-items: center;
297
+ gap: 8px;
298
+ }
299
+
300
+ .taskon-table__empty-icon {
301
+ font-size: 48px;
302
+ opacity: 0.5;
303
+ }
304
+
305
+ .taskon-table__empty-title {
306
+ font-size: 16px;
307
+ font-weight: 600;
308
+ color: var(--taskon-color-text-lightest, #ffffff);
309
+ margin: 0;
310
+ }
311
+
312
+ .taskon-table__empty-desc {
313
+ font-size: 14px;
314
+ color: var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
315
+ margin: 0;
316
+ }
317
+
318
+ /* 加载指示器 */
319
+ .taskon-table__loading-spinner {
320
+ display: inline-block;
321
+ width: 24px;
322
+ height: 24px;
323
+ border: 2px solid var(--taskon-color-text-dark, rgba(255, 255, 255, 0.4));
324
+ border-top-color: var(--taskon-color-primary, #6366f1);
325
+ border-radius: 50%;
326
+ animation: taskon-table-spin 0.8s linear infinite;
327
+ }
328
+
329
+ @keyframes taskon-table-spin {
330
+ from {
331
+ transform: rotate(0deg);
332
+ }
333
+ to {
334
+ transform: rotate(360deg);
335
+ }
336
+ }
337
+
338
+ /* Overlay loading - 覆盖在表格数据上方 */
339
+ .taskon-table__loading-overlay {
340
+ position: absolute;
341
+ top: 0;
342
+ left: 0;
343
+ right: 0;
344
+ bottom: 0;
345
+ display: flex;
346
+ align-items: center;
347
+ justify-content: center;
348
+ background-color: var(--taskon-color-overlay-bg, rgba(0, 0, 0, 0.5));
349
+ backdrop-filter: blur(2px);
350
+ z-index: 10;
351
+ border-radius: 4px;
352
+ }
353
+
354
+ /* ============================================================================
355
+ 紧凑模式
356
+ ============================================================================ */
357
+
358
+ .taskon-table--compact .taskon-table__header {
359
+ padding: 4px 12px;
360
+ }
361
+
362
+ .taskon-table--compact .taskon-table__cell {
363
+ padding: 12px;
364
+ }
365
+
366
+ /* ============================================================================
367
+ 无边框模式
368
+ ============================================================================ */
369
+
370
+ .taskon-table--borderless .taskon-table__row td {
371
+ border-top: none;
372
+ border-bottom: none;
373
+ }
374
+
375
+ /* ============================================================================
376
+ 响应式
377
+ ============================================================================ */
378
+
379
+ @media (max-width: 640px) {
380
+ .taskon-table__header,
381
+ .taskon-table__cell {
382
+ padding: 8px 12px;
383
+ }
384
+
385
+ .taskon-table--compact .taskon-table__header,
386
+ .taskon-table--compact .taskon-table__cell {
387
+ padding: 4px 8px;
388
+ }
389
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Toast 组件样式
3
+ * 遵循 TaskOn Widget 命名规范
4
+ */
5
+
6
+ /* ==================== Viewport 容器 ==================== */
7
+ .taskon-toast-viewport {
8
+ position: fixed;
9
+ top: 20px;
10
+ right: 20px;
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: 10px;
14
+ width: 320px;
15
+ max-width: calc(100vw - 40px);
16
+ margin: 0;
17
+ padding: 0;
18
+ list-style: none;
19
+ z-index: 999999;
20
+ outline: none;
21
+ }
22
+
23
+ /* ==================== Toast 基础样式 ==================== */
24
+ .taskon-toast {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 12px;
28
+ padding: 14px 16px;
29
+ border-radius: 8px;
30
+ background: #1a1a1a;
31
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
32
+ color: #fff;
33
+ font-size: 14px;
34
+ line-height: 1.4;
35
+ }
36
+
37
+ /* 动画 */
38
+ .taskon-toast[data-state="open"] {
39
+ animation: taskon-toast-slide-in 200ms ease-out;
40
+ }
41
+
42
+ .taskon-toast[data-state="closed"] {
43
+ animation: taskon-toast-hide 100ms ease-in;
44
+ }
45
+
46
+ .taskon-toast[data-swipe="move"] {
47
+ transform: translateX(var(--radix-toast-swipe-move-x));
48
+ }
49
+
50
+ .taskon-toast[data-swipe="cancel"] {
51
+ transform: translateX(0);
52
+ transition: transform 200ms ease-out;
53
+ }
54
+
55
+ .taskon-toast[data-swipe="end"] {
56
+ animation: taskon-toast-swipe-out 100ms ease-out;
57
+ }
58
+
59
+ @keyframes taskon-toast-slide-in {
60
+ from {
61
+ transform: translateX(calc(100% + 20px));
62
+ opacity: 0;
63
+ }
64
+ to {
65
+ transform: translateX(0);
66
+ opacity: 1;
67
+ }
68
+ }
69
+
70
+ @keyframes taskon-toast-hide {
71
+ from {
72
+ opacity: 1;
73
+ }
74
+ to {
75
+ opacity: 0;
76
+ }
77
+ }
78
+
79
+ @keyframes taskon-toast-swipe-out {
80
+ from {
81
+ transform: translateX(var(--radix-toast-swipe-end-x));
82
+ }
83
+ to {
84
+ transform: translateX(calc(100% + 20px));
85
+ }
86
+ }
87
+
88
+ /* ==================== Toast 图标 ==================== */
89
+ .taskon-toast-icon {
90
+ flex-shrink: 0;
91
+ width: 20px;
92
+ height: 20px;
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ border-radius: 50%;
97
+ font-size: 12px;
98
+ font-weight: bold;
99
+ }
100
+
101
+ /* ==================== Toast 消息 ==================== */
102
+ .taskon-toast-message {
103
+ flex: 1;
104
+ margin: 0;
105
+ }
106
+
107
+ /* ==================== Toast 类型变体 ==================== */
108
+
109
+ /* Success */
110
+ .taskon-toast--success {
111
+ border-left: 3px solid #00ffa3;
112
+ }
113
+
114
+ .taskon-toast--success .taskon-toast-icon {
115
+ background: rgba(0, 255, 163, 0.2);
116
+ color: #00ffa3;
117
+ }
118
+
119
+ /* Error */
120
+ .taskon-toast--error {
121
+ border-left: 3px solid #eb5757;
122
+ }
123
+
124
+ .taskon-toast--error .taskon-toast-icon {
125
+ background: rgba(235, 87, 87, 0.2);
126
+ color: #eb5757;
127
+ }
128
+
129
+ /* Warning */
130
+ .taskon-toast--warning {
131
+ border-left: 3px solid #f2c94c;
132
+ }
133
+
134
+ .taskon-toast--warning .taskon-toast-icon {
135
+ background: rgba(242, 201, 76, 0.2);
136
+ color: #f2c94c;
137
+ }
138
+
139
+ /* Info */
140
+ .taskon-toast--info {
141
+ border-left: 3px solid #2f80ed;
142
+ }
143
+
144
+ .taskon-toast--info .taskon-toast-icon {
145
+ background: rgba(47, 128, 237, 0.2);
146
+ color: #2f80ed;
147
+ }
148
+
149
+ /* ==================== 响应式 ==================== */
150
+ @media (max-width: 750px) {
151
+ .taskon-toast-viewport {
152
+ top: 10px;
153
+ right: 10px;
154
+ left: 10px;
155
+ width: auto;
156
+ max-width: none;
157
+ }
158
+
159
+ .taskon-toast {
160
+ padding: 12px 14px;
161
+ font-size: 13px;
162
+ }
163
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Dialog 组件样式
3
+ * 基于 Radix UI Dialog 封装
4
+ * 使用 taskon-dialog-* 命名空间
5
+ */
6
+
7
+ /* ==================== 遮罩层 ==================== */
8
+ .taskon-dialog-overlay {
9
+ position: fixed;
10
+ inset: 0;
11
+ z-index: 9998;
12
+ /* 复刻 Vue --bg-page-mask-20: rgb(66 66 66 / 50%) */
13
+ background-color: var(--taskon-color-overlay, rgba(66, 66, 66, 0.5));
14
+ backdrop-filter: blur(24px);
15
+
16
+ /* 动画 */
17
+ animation: taskon-dialog-overlay-fade-in 150ms ease-out;
18
+ }
19
+
20
+ .taskon-dialog-overlay[data-state="closed"] {
21
+ animation: taskon-dialog-overlay-fade-out 150ms ease-in;
22
+ }
23
+
24
+ @keyframes taskon-dialog-overlay-fade-in {
25
+ from {
26
+ opacity: 0;
27
+ }
28
+ to {
29
+ opacity: 1;
30
+ }
31
+ }
32
+
33
+ @keyframes taskon-dialog-overlay-fade-out {
34
+ from {
35
+ opacity: 1;
36
+ }
37
+ to {
38
+ opacity: 0;
39
+ }
40
+ }
41
+
42
+ /* ==================== 弹窗内容 ==================== */
43
+ .taskon-dialog-content {
44
+ position: fixed;
45
+ top: 50%;
46
+ left: 50%;
47
+ transform: translate(-50%, -50%);
48
+ z-index: 9999;
49
+
50
+ /* 尺寸 */
51
+ width: 90vw;
52
+ max-width: 500px;
53
+ max-height: 85vh;
54
+
55
+ /* 样式 - 复刻 Vue --bg-popup-basic-100: #0d0d0d */
56
+ background-color: var(--taskon-color-bg-popup, #0d0d0d);
57
+ color: var(--taskon-color-text, #ffffff);
58
+ border-radius: var(--taskon-border-radius-lg, 16px);
59
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
60
+
61
+ /* 布局 */
62
+ display: flex;
63
+ flex-direction: column;
64
+ overflow: hidden;
65
+
66
+ /* 移除默认的 focus outline */
67
+ outline: none;
68
+
69
+ /* 动画 */
70
+ animation: taskon-dialog-content-fade-in 200ms ease-out;
71
+ }
72
+
73
+ .taskon-dialog-content[data-state="closed"] {
74
+ animation: taskon-dialog-content-fade-out 150ms ease-in;
75
+ }
76
+
77
+ @keyframes taskon-dialog-content-fade-in {
78
+ from {
79
+ opacity: 0;
80
+ transform: translate(-50%, -48%) scale(0.96);
81
+ }
82
+ to {
83
+ opacity: 1;
84
+ transform: translate(-50%, -50%) scale(1);
85
+ }
86
+ }
87
+
88
+ @keyframes taskon-dialog-content-fade-out {
89
+ from {
90
+ opacity: 1;
91
+ transform: translate(-50%, -50%) scale(1);
92
+ }
93
+ to {
94
+ opacity: 0;
95
+ transform: translate(-50%, -48%) scale(0.96);
96
+ }
97
+ }
98
+
99
+ /* ==================== 无障碍标题/描述(屏幕阅读器可见) ==================== */
100
+ .taskon-dialog-title--sr-only,
101
+ .taskon-dialog-description--sr-only {
102
+ position: absolute;
103
+ width: 1px;
104
+ height: 1px;
105
+ padding: 0;
106
+ margin: -1px;
107
+ overflow: hidden;
108
+ clip: rect(0, 0, 0, 0);
109
+ white-space: nowrap;
110
+ border: 0;
111
+ }
112
+
113
+ /* ==================== 头部操作区 ==================== */
114
+ .taskon-dialog-header {
115
+ position: absolute;
116
+ top: 16px;
117
+ right: 16px;
118
+ z-index: 1;
119
+
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 8px;
123
+ }
124
+
125
+ .taskon-dialog-header-slot {
126
+ display: flex;
127
+ align-items: center;
128
+ }
129
+
130
+ /* ==================== 关闭按钮 ==================== */
131
+ .taskon-dialog-close {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+
136
+ width: 32px;
137
+ height: 32px;
138
+ padding: 0;
139
+
140
+ background: rgba(255, 255, 255, 0.1);
141
+ border: none;
142
+ border-radius: var(--taskon-border-radius, 8px);
143
+ cursor: pointer;
144
+
145
+ color: var(--taskon-color-text-secondary, #888);
146
+ transition: all 0.2s ease;
147
+ }
148
+
149
+ .taskon-dialog-close:hover {
150
+ background-color: rgba(255, 255, 255, 0.2);
151
+ color: var(--taskon-color-text, #fff);
152
+ }
153
+
154
+ .taskon-dialog-close:focus-visible {
155
+ outline: 2px solid var(--taskon-color-primary, #3b82f6);
156
+ outline-offset: 2px;
157
+ }
158
+
159
+ /* ==================== 主体内容 ==================== */
160
+ .taskon-dialog-body {
161
+ flex: 1;
162
+ overflow-y: auto;
163
+ padding: 24px;
164
+ }
165
+
166
+ /* ==================== 响应式 ==================== */
167
+ @media (max-width: 750px) {
168
+ .taskon-dialog-content {
169
+ width: 95vw;
170
+ max-height: 90vh;
171
+ border-radius: var(--taskon-border-radius, 12px);
172
+ }
173
+
174
+ .taskon-dialog-body {
175
+ padding: 20px;
176
+ }
177
+
178
+ .taskon-dialog-header {
179
+ top: 12px;
180
+ right: 12px;
181
+ }
182
+ }