xto-fronted 0.4.93 → 0.4.95

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 (92) hide show
  1. package/dist/assets/404-C9Uh6Uu-.css +1 -0
  2. package/dist/assets/404-zjGLLssH.js +1 -0
  3. package/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  4. package/dist/assets/index-B5xc4gQB.css +1 -0
  5. package/dist/assets/index-BDgOY6Rp.js +1 -0
  6. package/dist/assets/index-BIoRANs0.js +1 -0
  7. package/dist/assets/index-BRR97dc6.js +1 -0
  8. package/dist/assets/index-Bz0BgZQ1.js +1 -0
  9. package/dist/assets/index-CAdztNsv.css +1 -0
  10. package/dist/assets/index-CCXrcISf.css +1 -0
  11. package/dist/assets/index-CfpZmcpk.css +1 -0
  12. package/dist/assets/index-CwJSA85U.js +1 -0
  13. package/dist/assets/index-CwRA10ac.js +1 -0
  14. package/dist/assets/index-D8NDxq9d.js +1 -0
  15. package/dist/assets/index-DEB6-Iv_.js +2 -0
  16. package/dist/assets/index-DM4Ezclc.css +1 -0
  17. package/dist/assets/index-DYv7nImj.css +1 -0
  18. package/dist/assets/index-t-2Y0KhA.css +1 -0
  19. package/dist/assets/vendor-CUVPinTg.js +13 -0
  20. package/dist/assets/vue-vendor-DeJXJVbN.js +29 -0
  21. package/dist/assets/xto-base-CL2NKZJJ.css +1 -0
  22. package/dist/assets/xto-base-PwLGsxxb.js +1 -0
  23. package/dist/assets/xto-business--V1F5Gwb.css +1 -0
  24. package/dist/assets/xto-core-CtL4zKiV.js +1 -0
  25. package/dist/assets/xto-data-MxZsiJgi.css +1 -0
  26. package/dist/assets/xto-data-bCXQa7fT.js +1 -0
  27. package/dist/assets/xto-feedback-Bxx38c3P.css +1 -0
  28. package/dist/assets/xto-feedback-CPydp0kn.js +1 -0
  29. package/dist/assets/xto-form-Cu6q3VLG.css +1 -0
  30. package/dist/assets/xto-form-bywohdAf.js +1 -0
  31. package/dist/assets/xto-layout-BDD6sSlM.css +1 -0
  32. package/dist/assets/xto-navigation-Bbdpine9.js +1 -0
  33. package/dist/assets/xto-navigation-XfpyMpEo.css +1 -0
  34. package/dist/components/Layout/MixTopMenu.vue.d.ts +6 -1
  35. package/dist/components/Layout/Sidebar.vue.d.ts +2 -0
  36. package/dist/components/Layout/TopMenu.vue.d.ts +6 -1
  37. package/dist/components/Layout/index.vue.d.ts +6 -1
  38. package/dist/{index-D59X6HmM.js → index-3ekBp4iW.js} +2 -2
  39. package/dist/{index-Cp8kqjtv.js → index-58aI1w0v.js} +2 -2
  40. package/dist/{index-me_Uu2lk.js → index-A_B_Ap_A.js} +1560 -1590
  41. package/dist/{index-lJrh5CFc.js → index-B5DLfOYb.js} +23 -23
  42. package/dist/index-BAmYUT0G.js +189 -0
  43. package/dist/{index-B4U8Dy2W.js → index-BK4Mut6H.js} +2 -2
  44. package/dist/index-BRvi9qW-.js +515 -0
  45. package/dist/index-BVGW4DDQ.js +189 -0
  46. package/dist/index-BXg94yA2.js +515 -0
  47. package/dist/index-Bmf0YbVq.js +189 -0
  48. package/dist/index-C2-a5KSQ.js +4233 -0
  49. package/dist/index-CAHSv7LK.js +4285 -0
  50. package/dist/index-CeZ0CSSs.js +641 -0
  51. package/dist/index-Cf8E7FM1.js +4270 -0
  52. package/dist/index-CgyQqbdx.js +189 -0
  53. package/dist/index-ChowNrlU.js +641 -0
  54. package/dist/index-D25KzR0I.js +479 -0
  55. package/dist/index-DCBIjLHy.js +515 -0
  56. package/dist/index-DEYOivza.js +641 -0
  57. package/dist/index-DReodgBw.js +4233 -0
  58. package/dist/index-DjERNRXX.js +515 -0
  59. package/dist/index-LSdsO2Ox.js +479 -0
  60. package/dist/index-UJixTdep.js +479 -0
  61. package/dist/index-gBlRG4kk.js +479 -0
  62. package/dist/index-xWU3J3OH.js +641 -0
  63. package/dist/index.es.js +1 -1
  64. package/dist/index.html +28 -0
  65. package/dist/index.umd.js +8 -8
  66. package/dist/style.css +1 -1
  67. package/package.json +91 -91
  68. package/src/App.vue +48 -48
  69. package/src/assets/styles/_dark.scss +639 -639
  70. package/src/assets/styles/_root.scss +183 -183
  71. package/src/assets/styles/_variables.scss +69 -69
  72. package/src/assets/styles/index.scss +460 -460
  73. package/src/components/Layout/MixTopMenu.vue +8 -1
  74. package/src/components/Layout/Sidebar.vue +200 -198
  75. package/src/components/Layout/SidebarMenuItem.vue +158 -158
  76. package/src/components/Layout/TopMenu.vue +1177 -1170
  77. package/src/components/Layout/index.vue +199 -192
  78. package/src/composables/useI18n.ts +43 -43
  79. package/src/index.ts +100 -100
  80. package/src/router/layoutRoute.ts +59 -59
  81. package/src/stores/index.ts +15 -15
  82. package/src/stores/locale.ts +66 -66
  83. package/src/types/json-bigint.d.ts +18 -18
  84. package/src/types/xto.d.ts +172 -172
  85. package/src/utils/request.ts +184 -184
  86. package/src/views/dashboard/index.vue +545 -545
  87. package/src/views/error/403.vue +251 -251
  88. package/src/views/error/404.vue +253 -253
  89. package/src/views/login/index.vue +586 -586
  90. package/src/views/system/menu/index.vue +690 -690
  91. package/src/views/system/role/index.vue +583 -583
  92. package/src/views/system/user/index.vue +655 -655
@@ -1,461 +1,461 @@
1
- // ==============================================
2
- // 全局样式入口
3
- // ==============================================
4
-
5
- // CSS 变量(根选择器)
6
- @use 'root';
7
-
8
- // Reset
9
- @use 'reset';
10
-
11
- // Transitions
12
- @use 'transition';
13
-
14
- // Dark Theme Override
15
- @use 'dark';
16
-
17
- // ==============================================
18
- // 全局通用样式(企业级增强)
19
- // ==============================================
20
-
21
- // 文字截断
22
- .text-ellipsis {
23
- overflow: hidden;
24
- text-overflow: ellipsis;
25
- white-space: nowrap;
26
- }
27
-
28
- // 多行截断
29
- .text-ellipsis-2 {
30
- display: -webkit-box;
31
- -webkit-line-clamp: 2;
32
- -webkit-box-orient: vertical;
33
- overflow: hidden;
34
- }
35
-
36
- .text-ellipsis-3 {
37
- display: -webkit-box;
38
- -webkit-line-clamp: 3;
39
- -webkit-box-orient: vertical;
40
- overflow: hidden;
41
- }
42
-
43
- // Flex 布局
44
- .flex {
45
- display: flex;
46
- }
47
-
48
- .flex-center {
49
- display: flex;
50
- align-items: center;
51
- justify-content: center;
52
- }
53
-
54
- .flex-between {
55
- display: flex;
56
- align-items: center;
57
- justify-content: space-between;
58
- }
59
-
60
- .flex-start {
61
- display: flex;
62
- align-items: center;
63
- justify-content: flex-start;
64
- }
65
-
66
- .flex-end {
67
- display: flex;
68
- align-items: center;
69
- justify-content: flex-end;
70
- }
71
-
72
- .flex-wrap {
73
- flex-wrap: wrap;
74
- }
75
-
76
- .flex-1 {
77
- flex: 1;
78
- }
79
-
80
- .flex-shrink-0 {
81
- flex-shrink: 0;
82
- }
83
-
84
- // 方向
85
- .flex-col {
86
- display: flex;
87
- flex-direction: column;
88
- }
89
-
90
- .flex-col-center {
91
- display: flex;
92
- flex-direction: column;
93
- align-items: center;
94
- }
95
-
96
- // Gap 间距(8px 网格系统)
97
- .gap-4 { gap: 4px; }
98
- .gap-8 { gap: 8px; }
99
- .gap-12 { gap: 12px; }
100
- .gap-16 { gap: 16px; }
101
- .gap-20 { gap: 20px; }
102
- .gap-24 { gap: 24px; }
103
- .gap-32 { gap: 32px; }
104
-
105
- // 文字对齐
106
- .text-left {
107
- text-align: left;
108
- }
109
-
110
- .text-center {
111
- text-align: center;
112
- }
113
-
114
- .text-right {
115
- text-align: right;
116
- }
117
-
118
- // 颜色
119
- .text-primary {
120
- color: var(--color-primary);
121
- }
122
-
123
- .text-success {
124
- color: var(--color-success);
125
- }
126
-
127
- .text-warning {
128
- color: var(--color-warning);
129
- }
130
-
131
- .text-danger {
132
- color: var(--color-danger);
133
- }
134
-
135
- .text-info {
136
- color: var(--color-info);
137
- }
138
-
139
- .text-secondary {
140
- color: var(--color-text-secondary);
141
- }
142
-
143
- .text-placeholder {
144
- color: var(--color-text-placeholder);
145
- }
146
-
147
- // 背景
148
- .bg-primary {
149
- background-color: var(--color-primary);
150
- }
151
-
152
- .bg-success {
153
- background-color: var(--color-success);
154
- }
155
-
156
- .bg-warning {
157
- background-color: var(--color-warning);
158
- }
159
-
160
- .bg-danger {
161
- background-color: var(--color-danger);
162
- }
163
-
164
- .bg-page {
165
- background-color: var(--bg-color-page);
166
- }
167
-
168
- .bg-card {
169
- background-color: var(--bg-color);
170
- }
171
-
172
- // 间距(8px 网格系统)
173
- .mt-4 { margin-top: 4px; }
174
- .mt-8 { margin-top: 8px; }
175
- .mt-12 { margin-top: 12px; }
176
- .mt-16 { margin-top: 16px; }
177
- .mt-20 { margin-top: 20px; }
178
- .mt-24 { margin-top: 24px; }
179
- .mt-32 { margin-top: 32px; }
180
-
181
- .mb-4 { margin-bottom: 4px; }
182
- .mb-8 { margin-bottom: 8px; }
183
- .mb-12 { margin-bottom: 12px; }
184
- .mb-16 { margin-bottom: 16px; }
185
- .mb-20 { margin-bottom: 20px; }
186
- .mb-24 { margin-bottom: 24px; }
187
- .mb-32 { margin-bottom: 32px; }
188
-
189
- .ml-4 { margin-left: 4px; }
190
- .ml-8 { margin-left: 8px; }
191
- .ml-12 { margin-left: 12px; }
192
- .ml-16 { margin-left: 16px; }
193
-
194
- .mr-4 { margin-right: 4px; }
195
- .mr-8 { margin-right: 8px; }
196
- .mr-12 { margin-right: 12px; }
197
- .mr-16 { margin-right: 16px; }
198
-
199
- .p-4 { padding: 4px; }
200
- .p-8 { padding: 8px; }
201
- .p-12 { padding: 12px; }
202
- .p-16 { padding: 16px; }
203
- .p-20 { padding: 20px; }
204
- .p-24 { padding: 24px; }
205
- .p-32 { padding: 32px; }
206
-
207
- .px-4 { padding-left: 4px; padding-right: 4px; }
208
- .px-8 { padding-left: 8px; padding-right: 8px; }
209
- .px-12 { padding-left: 12px; padding-right: 12px; }
210
- .px-16 { padding-left: 16px; padding-right: 16px; }
211
- .px-24 { padding-left: 24px; padding-right: 24px; }
212
-
213
- .py-4 { padding-top: 4px; padding-bottom: 4px; }
214
- .py-8 { padding-top: 8px; padding-bottom: 8px; }
215
- .py-12 { padding-top: 12px; padding-bottom: 12px; }
216
- .py-16 { padding-top: 16px; padding-bottom: 16px; }
217
- .py-24 { padding-top: 24px; padding-bottom: 24px; }
218
-
219
- // 卡片容器(企业级)
220
- .card {
221
- background-color: var(--bg-color);
222
- border-radius: var(--border-radius-large);
223
- box-shadow: var(--box-shadow-card);
224
- padding: var(--spacing-lg);
225
- transition: box-shadow 0.3s ease;
226
-
227
- &:hover {
228
- box-shadow: var(--box-shadow-card-hover);
229
- }
230
- }
231
-
232
- .card-flat {
233
- background-color: var(--bg-color);
234
- border-radius: var(--border-radius-large);
235
- padding: var(--spacing-lg);
236
- border: 1px solid var(--color-border-lighter);
237
- }
238
-
239
- // 页面容器
240
- .page-container {
241
- padding: 12px;
242
- min-height: 100%;
243
- background: var(--bg-color-page);
244
- }
245
-
246
- // 搜索栏(企业级)
247
- .search-bar {
248
- display: flex;
249
- flex-wrap: wrap;
250
- gap: var(--spacing-md);
251
- margin-bottom: 12px;
252
- padding: 12px;
253
- background: var(--bg-color);
254
- border-radius: var(--border-radius-large);
255
- box-shadow: var(--box-shadow-card);
256
- }
257
-
258
- // 工具栏(企业级)
259
- .toolbar {
260
- display: flex;
261
- align-items: center;
262
- justify-content: space-between;
263
- padding: 12px;
264
- border-bottom: 1px solid var(--color-border-lighter);
265
- }
266
-
267
- .toolbar-left {
268
- display: flex;
269
- align-items: center;
270
- gap: var(--spacing-sm);
271
- }
272
-
273
- .toolbar-right {
274
- display: flex;
275
- align-items: center;
276
- gap: var(--spacing-sm);
277
- }
278
-
279
- // 表格容器(企业级)
280
- .table-container {
281
- background-color: var(--bg-color);
282
- border-radius: var(--border-radius-large);
283
- box-shadow: var(--box-shadow-card);
284
- overflow: hidden;
285
- }
286
-
287
- // 分页容器
288
- .pagination-container {
289
- display: flex;
290
- justify-content: flex-end;
291
- padding: 12px;
292
- border-top: 1px solid var(--color-border-lighter);
293
- }
294
-
295
- // 标签徽章
296
- .badge {
297
- display: inline-flex;
298
- align-items: center;
299
- justify-content: center;
300
- min-width: 20px;
301
- height: 20px;
302
- padding: 0 6px;
303
- font-size: 12px;
304
- font-weight: 500;
305
- border-radius: 10px;
306
- background: var(--color-fill);
307
- color: var(--color-text-secondary);
308
- }
309
-
310
- .badge-primary {
311
- background: var(--color-primary-light-6);
312
- color: var(--color-primary);
313
- }
314
-
315
- .badge-success {
316
- background: var(--color-success-lighter);
317
- color: var(--color-success);
318
- }
319
-
320
- .badge-warning {
321
- background: var(--color-warning-lighter);
322
- color: var(--color-warning);
323
- }
324
-
325
- .badge-danger {
326
- background: var(--color-danger-lighter);
327
- color: var(--color-danger);
328
- }
329
-
330
- // 分隔线
331
- .divider {
332
- height: 1px;
333
- background: var(--color-border-lighter);
334
- margin: var(--spacing-md) 0;
335
- }
336
-
337
- .divider-vertical {
338
- width: 1px;
339
- height: 100%;
340
- background: var(--color-border-lighter);
341
- margin: 0 var(--spacing-md);
342
- }
343
-
344
- // 空状态
345
- .empty-state {
346
- display: flex;
347
- flex-direction: column;
348
- align-items: center;
349
- justify-content: center;
350
- padding: 60px 20px;
351
- color: var(--color-text-placeholder);
352
-
353
- .empty-icon {
354
- width: 64px;
355
- height: 64px;
356
- margin-bottom: 16px;
357
- opacity: 0.5;
358
- }
359
-
360
- .empty-text {
361
- font-size: 14px;
362
- }
363
- }
364
-
365
- // 加载状态
366
- .loading-state {
367
- display: flex;
368
- flex-direction: column;
369
- align-items: center;
370
- justify-content: center;
371
- padding: 60px 20px;
372
-
373
- .loading-spinner {
374
- width: 32px;
375
- height: 32px;
376
- border: 3px solid var(--color-border-lighter);
377
- border-top-color: var(--color-primary);
378
- border-radius: 50%;
379
- animation: spin 0.8s linear infinite;
380
- }
381
-
382
- .loading-text {
383
- margin-top: 16px;
384
- font-size: 14px;
385
- color: var(--color-text-secondary);
386
- }
387
- }
388
-
389
- @keyframes spin {
390
- to { transform: rotate(360deg); }
391
- }
392
-
393
- // 链接样式
394
- .link {
395
- color: var(--color-primary);
396
- text-decoration: none;
397
- transition: color 0.2s ease;
398
-
399
- &:hover {
400
- color: var(--color-primary-dark-1);
401
- }
402
- }
403
-
404
- .link-underline {
405
- color: var(--color-primary);
406
- text-decoration: underline;
407
- text-underline-offset: 2px;
408
-
409
- &:hover {
410
- color: var(--color-primary-dark-1);
411
- }
412
- }
413
-
414
- // ==============================================
415
- // 菜单高亮样式(全局样式,不能在 scoped 中)
416
- // ==============================================
417
- .x-menu-item {
418
- &.is-active {
419
- color: var(--color-primary) !important;
420
- background-color: var(--color-primary-light-9) !important;
421
- position: relative;
422
-
423
- // 左侧高亮条
424
- &::before {
425
- content: '';
426
- position: absolute;
427
- left: 0;
428
- top: 0;
429
- bottom: 0;
430
- width: 4px;
431
- background-color: var(--color-primary);
432
- border-radius: 0 2px 2px 0;
433
- }
434
- }
435
- }
436
-
437
- // SubMenu 的子菜单项高亮(只有 MenuItem 高亮,SubMenu 本身不高亮)
438
- .x-sub-menu__menu .x-menu-item.is-active {
439
- color: var(--color-primary) !important;
440
- background-color: var(--color-primary-light-9) !important;
441
- position: relative;
442
-
443
- &::before {
444
- content: '';
445
- position: absolute;
446
- left: 0;
447
- top: 0;
448
- bottom: 0;
449
- width: 4px;
450
- background-color: var(--color-primary);
451
- border-radius: 0 2px 2px 0;
452
- }
453
- }
454
-
455
- // ==============================================
456
- // 灰色模式(全局样式,不能在 scoped 中)
457
- // ==============================================
458
- html.grey-mode {
459
- filter: grayscale(100%);
460
- -webkit-filter: grayscale(100%);
1
+ // ==============================================
2
+ // 全局样式入口
3
+ // ==============================================
4
+
5
+ // CSS 变量(根选择器)
6
+ @use 'root';
7
+
8
+ // Reset
9
+ @use 'reset';
10
+
11
+ // Transitions
12
+ @use 'transition';
13
+
14
+ // Dark Theme Override
15
+ @use 'dark';
16
+
17
+ // ==============================================
18
+ // 全局通用样式(企业级增强)
19
+ // ==============================================
20
+
21
+ // 文字截断
22
+ .text-ellipsis {
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+ white-space: nowrap;
26
+ }
27
+
28
+ // 多行截断
29
+ .text-ellipsis-2 {
30
+ display: -webkit-box;
31
+ -webkit-line-clamp: 2;
32
+ -webkit-box-orient: vertical;
33
+ overflow: hidden;
34
+ }
35
+
36
+ .text-ellipsis-3 {
37
+ display: -webkit-box;
38
+ -webkit-line-clamp: 3;
39
+ -webkit-box-orient: vertical;
40
+ overflow: hidden;
41
+ }
42
+
43
+ // Flex 布局
44
+ .flex {
45
+ display: flex;
46
+ }
47
+
48
+ .flex-center {
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ }
53
+
54
+ .flex-between {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: space-between;
58
+ }
59
+
60
+ .flex-start {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: flex-start;
64
+ }
65
+
66
+ .flex-end {
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: flex-end;
70
+ }
71
+
72
+ .flex-wrap {
73
+ flex-wrap: wrap;
74
+ }
75
+
76
+ .flex-1 {
77
+ flex: 1;
78
+ }
79
+
80
+ .flex-shrink-0 {
81
+ flex-shrink: 0;
82
+ }
83
+
84
+ // 方向
85
+ .flex-col {
86
+ display: flex;
87
+ flex-direction: column;
88
+ }
89
+
90
+ .flex-col-center {
91
+ display: flex;
92
+ flex-direction: column;
93
+ align-items: center;
94
+ }
95
+
96
+ // Gap 间距(8px 网格系统)
97
+ .gap-4 { gap: 4px; }
98
+ .gap-8 { gap: 8px; }
99
+ .gap-12 { gap: 12px; }
100
+ .gap-16 { gap: 16px; }
101
+ .gap-20 { gap: 20px; }
102
+ .gap-24 { gap: 24px; }
103
+ .gap-32 { gap: 32px; }
104
+
105
+ // 文字对齐
106
+ .text-left {
107
+ text-align: left;
108
+ }
109
+
110
+ .text-center {
111
+ text-align: center;
112
+ }
113
+
114
+ .text-right {
115
+ text-align: right;
116
+ }
117
+
118
+ // 颜色
119
+ .text-primary {
120
+ color: var(--color-primary);
121
+ }
122
+
123
+ .text-success {
124
+ color: var(--color-success);
125
+ }
126
+
127
+ .text-warning {
128
+ color: var(--color-warning);
129
+ }
130
+
131
+ .text-danger {
132
+ color: var(--color-danger);
133
+ }
134
+
135
+ .text-info {
136
+ color: var(--color-info);
137
+ }
138
+
139
+ .text-secondary {
140
+ color: var(--color-text-secondary);
141
+ }
142
+
143
+ .text-placeholder {
144
+ color: var(--color-text-placeholder);
145
+ }
146
+
147
+ // 背景
148
+ .bg-primary {
149
+ background-color: var(--color-primary);
150
+ }
151
+
152
+ .bg-success {
153
+ background-color: var(--color-success);
154
+ }
155
+
156
+ .bg-warning {
157
+ background-color: var(--color-warning);
158
+ }
159
+
160
+ .bg-danger {
161
+ background-color: var(--color-danger);
162
+ }
163
+
164
+ .bg-page {
165
+ background-color: var(--bg-color-page);
166
+ }
167
+
168
+ .bg-card {
169
+ background-color: var(--bg-color);
170
+ }
171
+
172
+ // 间距(8px 网格系统)
173
+ .mt-4 { margin-top: 4px; }
174
+ .mt-8 { margin-top: 8px; }
175
+ .mt-12 { margin-top: 12px; }
176
+ .mt-16 { margin-top: 16px; }
177
+ .mt-20 { margin-top: 20px; }
178
+ .mt-24 { margin-top: 24px; }
179
+ .mt-32 { margin-top: 32px; }
180
+
181
+ .mb-4 { margin-bottom: 4px; }
182
+ .mb-8 { margin-bottom: 8px; }
183
+ .mb-12 { margin-bottom: 12px; }
184
+ .mb-16 { margin-bottom: 16px; }
185
+ .mb-20 { margin-bottom: 20px; }
186
+ .mb-24 { margin-bottom: 24px; }
187
+ .mb-32 { margin-bottom: 32px; }
188
+
189
+ .ml-4 { margin-left: 4px; }
190
+ .ml-8 { margin-left: 8px; }
191
+ .ml-12 { margin-left: 12px; }
192
+ .ml-16 { margin-left: 16px; }
193
+
194
+ .mr-4 { margin-right: 4px; }
195
+ .mr-8 { margin-right: 8px; }
196
+ .mr-12 { margin-right: 12px; }
197
+ .mr-16 { margin-right: 16px; }
198
+
199
+ .p-4 { padding: 4px; }
200
+ .p-8 { padding: 8px; }
201
+ .p-12 { padding: 12px; }
202
+ .p-16 { padding: 16px; }
203
+ .p-20 { padding: 20px; }
204
+ .p-24 { padding: 24px; }
205
+ .p-32 { padding: 32px; }
206
+
207
+ .px-4 { padding-left: 4px; padding-right: 4px; }
208
+ .px-8 { padding-left: 8px; padding-right: 8px; }
209
+ .px-12 { padding-left: 12px; padding-right: 12px; }
210
+ .px-16 { padding-left: 16px; padding-right: 16px; }
211
+ .px-24 { padding-left: 24px; padding-right: 24px; }
212
+
213
+ .py-4 { padding-top: 4px; padding-bottom: 4px; }
214
+ .py-8 { padding-top: 8px; padding-bottom: 8px; }
215
+ .py-12 { padding-top: 12px; padding-bottom: 12px; }
216
+ .py-16 { padding-top: 16px; padding-bottom: 16px; }
217
+ .py-24 { padding-top: 24px; padding-bottom: 24px; }
218
+
219
+ // 卡片容器(企业级)
220
+ .card {
221
+ background-color: var(--bg-color);
222
+ border-radius: var(--border-radius-large);
223
+ box-shadow: var(--box-shadow-card);
224
+ padding: var(--spacing-lg);
225
+ transition: box-shadow 0.3s ease;
226
+
227
+ &:hover {
228
+ box-shadow: var(--box-shadow-card-hover);
229
+ }
230
+ }
231
+
232
+ .card-flat {
233
+ background-color: var(--bg-color);
234
+ border-radius: var(--border-radius-large);
235
+ padding: var(--spacing-lg);
236
+ border: 1px solid var(--color-border-lighter);
237
+ }
238
+
239
+ // 页面容器
240
+ .page-container {
241
+ padding: 12px;
242
+ min-height: 100%;
243
+ background: var(--bg-color-page);
244
+ }
245
+
246
+ // 搜索栏(企业级)
247
+ .search-bar {
248
+ display: flex;
249
+ flex-wrap: wrap;
250
+ gap: var(--spacing-md);
251
+ margin-bottom: 12px;
252
+ padding: 12px;
253
+ background: var(--bg-color);
254
+ border-radius: var(--border-radius-large);
255
+ box-shadow: var(--box-shadow-card);
256
+ }
257
+
258
+ // 工具栏(企业级)
259
+ .toolbar {
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: space-between;
263
+ padding: 12px;
264
+ border-bottom: 1px solid var(--color-border-lighter);
265
+ }
266
+
267
+ .toolbar-left {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: var(--spacing-sm);
271
+ }
272
+
273
+ .toolbar-right {
274
+ display: flex;
275
+ align-items: center;
276
+ gap: var(--spacing-sm);
277
+ }
278
+
279
+ // 表格容器(企业级)
280
+ .table-container {
281
+ background-color: var(--bg-color);
282
+ border-radius: var(--border-radius-large);
283
+ box-shadow: var(--box-shadow-card);
284
+ overflow: hidden;
285
+ }
286
+
287
+ // 分页容器
288
+ .pagination-container {
289
+ display: flex;
290
+ justify-content: flex-end;
291
+ padding: 12px;
292
+ border-top: 1px solid var(--color-border-lighter);
293
+ }
294
+
295
+ // 标签徽章
296
+ .badge {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ min-width: 20px;
301
+ height: 20px;
302
+ padding: 0 6px;
303
+ font-size: 12px;
304
+ font-weight: 500;
305
+ border-radius: 10px;
306
+ background: var(--color-fill);
307
+ color: var(--color-text-secondary);
308
+ }
309
+
310
+ .badge-primary {
311
+ background: var(--color-primary-light-6);
312
+ color: var(--color-primary);
313
+ }
314
+
315
+ .badge-success {
316
+ background: var(--color-success-lighter);
317
+ color: var(--color-success);
318
+ }
319
+
320
+ .badge-warning {
321
+ background: var(--color-warning-lighter);
322
+ color: var(--color-warning);
323
+ }
324
+
325
+ .badge-danger {
326
+ background: var(--color-danger-lighter);
327
+ color: var(--color-danger);
328
+ }
329
+
330
+ // 分隔线
331
+ .divider {
332
+ height: 1px;
333
+ background: var(--color-border-lighter);
334
+ margin: var(--spacing-md) 0;
335
+ }
336
+
337
+ .divider-vertical {
338
+ width: 1px;
339
+ height: 100%;
340
+ background: var(--color-border-lighter);
341
+ margin: 0 var(--spacing-md);
342
+ }
343
+
344
+ // 空状态
345
+ .empty-state {
346
+ display: flex;
347
+ flex-direction: column;
348
+ align-items: center;
349
+ justify-content: center;
350
+ padding: 60px 20px;
351
+ color: var(--color-text-placeholder);
352
+
353
+ .empty-icon {
354
+ width: 64px;
355
+ height: 64px;
356
+ margin-bottom: 16px;
357
+ opacity: 0.5;
358
+ }
359
+
360
+ .empty-text {
361
+ font-size: 14px;
362
+ }
363
+ }
364
+
365
+ // 加载状态
366
+ .loading-state {
367
+ display: flex;
368
+ flex-direction: column;
369
+ align-items: center;
370
+ justify-content: center;
371
+ padding: 60px 20px;
372
+
373
+ .loading-spinner {
374
+ width: 32px;
375
+ height: 32px;
376
+ border: 3px solid var(--color-border-lighter);
377
+ border-top-color: var(--color-primary);
378
+ border-radius: 50%;
379
+ animation: spin 0.8s linear infinite;
380
+ }
381
+
382
+ .loading-text {
383
+ margin-top: 16px;
384
+ font-size: 14px;
385
+ color: var(--color-text-secondary);
386
+ }
387
+ }
388
+
389
+ @keyframes spin {
390
+ to { transform: rotate(360deg); }
391
+ }
392
+
393
+ // 链接样式
394
+ .link {
395
+ color: var(--color-primary);
396
+ text-decoration: none;
397
+ transition: color 0.2s ease;
398
+
399
+ &:hover {
400
+ color: var(--color-primary-dark-1);
401
+ }
402
+ }
403
+
404
+ .link-underline {
405
+ color: var(--color-primary);
406
+ text-decoration: underline;
407
+ text-underline-offset: 2px;
408
+
409
+ &:hover {
410
+ color: var(--color-primary-dark-1);
411
+ }
412
+ }
413
+
414
+ // ==============================================
415
+ // 菜单高亮样式(全局样式,不能在 scoped 中)
416
+ // ==============================================
417
+ .x-menu-item {
418
+ &.is-active {
419
+ color: var(--color-primary) !important;
420
+ background-color: var(--color-primary-light-9) !important;
421
+ position: relative;
422
+
423
+ // 左侧高亮条
424
+ &::before {
425
+ content: '';
426
+ position: absolute;
427
+ left: 0;
428
+ top: 0;
429
+ bottom: 0;
430
+ width: 4px;
431
+ background-color: var(--color-primary);
432
+ border-radius: 0 2px 2px 0;
433
+ }
434
+ }
435
+ }
436
+
437
+ // SubMenu 的子菜单项高亮(只有 MenuItem 高亮,SubMenu 本身不高亮)
438
+ .x-sub-menu__menu .x-menu-item.is-active {
439
+ color: var(--color-primary) !important;
440
+ background-color: var(--color-primary-light-9) !important;
441
+ position: relative;
442
+
443
+ &::before {
444
+ content: '';
445
+ position: absolute;
446
+ left: 0;
447
+ top: 0;
448
+ bottom: 0;
449
+ width: 4px;
450
+ background-color: var(--color-primary);
451
+ border-radius: 0 2px 2px 0;
452
+ }
453
+ }
454
+
455
+ // ==============================================
456
+ // 灰色模式(全局样式,不能在 scoped 中)
457
+ // ==============================================
458
+ html.grey-mode {
459
+ filter: grayscale(100%);
460
+ -webkit-filter: grayscale(100%);
461
461
  }