xto-fronted 0.7.0 → 0.8.0

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.
@@ -3,10 +3,38 @@ import { ref } from 'vue'
3
3
  import { Progress } from '@xto/data'
4
4
 
5
5
  const stats = ref([
6
- { title: '用户总数', value: 1234, icon: '👥', color: '#1677ff', trend: '+12.5%', trendUp: true },
7
- { title: '今日访问', value: 567, icon: '👀', color: '#52c41a', trend: '+8.2%', trendUp: true },
8
- { title: '订单数量', value: 890, icon: '📦', color: '#faad14', trend: '-3.1%', trendUp: false },
9
- { title: '销售金额', value: 123456, icon: '💰', color: '#ff4d4f', trend: '+15.8%', trendUp: true }
6
+ {
7
+ title: '用户总数',
8
+ value: 1234,
9
+ icon: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',
10
+ color: 'var(--xto-color-primary, #4F46E5)',
11
+ trend: '+12.5%',
12
+ trendUp: true
13
+ },
14
+ {
15
+ title: '今日访问',
16
+ value: 567,
17
+ icon: 'M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6-10-6-10-6Zm10 2.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z',
18
+ color: 'var(--xto-color-success, #00A870)',
19
+ trend: '+8.2%',
20
+ trendUp: true
21
+ },
22
+ {
23
+ title: '订单数量',
24
+ value: 890,
25
+ icon: 'M21 8l-9-5-9 5v8l9 5 9-5V8Zm-9-2.7L18.6 8 12 11.7 5.4 8 12 5.3Z',
26
+ color: 'var(--xto-color-warning, #FF7D00)',
27
+ trend: '-3.1%',
28
+ trendUp: false
29
+ },
30
+ {
31
+ title: '销售金额',
32
+ value: 123456,
33
+ icon: 'M3 7h18v10H3V7Zm9 5a2.5 2.5 0 1 0 0 .01M6.5 12h.01M17.5 12h.01',
34
+ color: 'var(--xto-color-danger, #F53F3F)',
35
+ trend: '+15.8%',
36
+ trendUp: true
37
+ }
10
38
  ])
11
39
 
12
40
  const activities = ref([
@@ -18,10 +46,30 @@ const activities = ref([
18
46
  ])
19
47
 
20
48
  const quickLinks = ref([
21
- { title: '用户管理', path: '/system/user', icon: '👤', desc: '管理系统用户' },
22
- { title: '角色管理', path: '/system/role', icon: '👥', desc: '角色权限配置' },
23
- { title: '菜单管理', path: '/system/menu', icon: '📋', desc: '菜单路由管理' },
24
- { title: '系统设置', path: '/system', icon: '⚙️', desc: '系统参数配置' }
49
+ {
50
+ title: '用户管理',
51
+ path: '/system/user',
52
+ icon: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',
53
+ desc: '管理系统用户'
54
+ },
55
+ {
56
+ title: '角色管理',
57
+ path: '/system/role',
58
+ icon: 'M8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm8 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM2 19a6 6 0 0 1 12 0m2-6a6 6 0 0 1 6 6',
59
+ desc: '角色权限配置'
60
+ },
61
+ {
62
+ title: '菜单管理',
63
+ path: '/system/menu',
64
+ icon: 'M4 6h16M4 12h16M4 18h10',
65
+ desc: '菜单路由管理'
66
+ },
67
+ {
68
+ title: '系统设置',
69
+ path: '/system',
70
+ icon: 'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm7.4-3a7.4 7.4 0 0 0-.1-1.2l2-1.6-2-3.4-2.4 1a7.6 7.6 0 0 0-2-1.2L14.5 3h-5l-.4 2.6a7.6 7.6 0 0 0-2 1.2l-2.4-1-2 3.4 2 1.6a7.4 7.4 0 0 0 0 2.4l-2 1.6 2 3.4 2.4-1a7.6 7.6 0 0 0 2 1.2l.4 2.6h5l.4-2.6a7.6 7.6 0 0 0 2-1.2l2.4 1 2-3.4-2-1.6c.1-.4.1-.8.1-1.2Z',
71
+ desc: '系统参数配置'
72
+ }
25
73
  ])
26
74
 
27
75
  const systemInfo = ref([
@@ -37,14 +85,14 @@ const systemInfo = ref([
37
85
  <!-- 统计卡片 -->
38
86
  <div class="stats-section">
39
87
  <div v-for="stat in stats" :key="stat.title" class="stat-card">
40
- <div class="stat-icon" :style="{ background: `linear-gradient(135deg, ${stat.color}20 0%, ${stat.color}10 100%)` }">
41
- <span>{{ stat.icon }}</span>
88
+ <div class="stat-icon">
89
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" :style="{ color: stat.color }">
90
+ <path :d="stat.icon" />
91
+ </svg>
42
92
  </div>
43
93
  <div class="stat-content">
44
94
  <div class="stat-title">{{ stat.title }}</div>
45
- <div class="stat-value" :style="{ color: stat.color }">
46
- {{ stat.value.toLocaleString() }}
47
- </div>
95
+ <div class="stat-value">{{ stat.value.toLocaleString() }}</div>
48
96
  <div class="stat-trend" :class="{ up: stat.trendUp, down: !stat.trendUp }">
49
97
  <svg v-if="stat.trendUp" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
50
98
  <path d="M7 17l5-5 5 5M7 7l5 5 5-5"/>
@@ -55,7 +103,6 @@ const systemInfo = ref([
55
103
  <span>{{ stat.trend }}</span>
56
104
  </div>
57
105
  </div>
58
- <div class="stat-decoration" :style="{ background: `linear-gradient(135deg, ${stat.color}08 0%, transparent 100%)` }"></div>
59
106
  </div>
60
107
  </div>
61
108
 
@@ -74,7 +121,11 @@ const systemInfo = ref([
74
121
  :to="link.path"
75
122
  class="quick-card"
76
123
  >
77
- <div class="quick-icon">{{ link.icon }}</div>
124
+ <div class="quick-icon">
125
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
126
+ <path :d="link.icon" />
127
+ </svg>
128
+ </div>
78
129
  <div class="quick-info">
79
130
  <div class="quick-title">{{ link.title }}</div>
80
131
  <div class="quick-desc">{{ link.desc }}</div>
@@ -106,7 +157,6 @@ const systemInfo = ref([
106
157
  </div>
107
158
  <div class="activity-time">{{ activity.time }}</div>
108
159
  </div>
109
- <div class="activity-dot" :class="activity.type"></div>
110
160
  </div>
111
161
  </div>
112
162
  </div>
@@ -176,24 +226,17 @@ const systemInfo = ref([
176
226
  }
177
227
 
178
228
  .stat-card {
179
- position: relative;
180
229
  display: flex;
181
230
  align-items: flex-start;
182
231
  gap: 16px;
183
232
  padding: 20px;
184
233
  background: var(--xto-bg-color, #FFFFFF);
185
- border-radius: var(--xto-border-radius-large, 8px);
186
- box-shadow: var(--xto-shadow-subtle, 0 1px 2px 0 rgba(0,0,0,0.05));
187
- transition: all 0.3s ease;
188
- overflow: hidden;
234
+ border-radius: var(--xto-border-radius-large, 12px);
235
+ box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
236
+ transition: box-shadow 0.2s ease;
189
237
 
190
238
  &:hover {
191
- box-shadow: var(--xto-shadow-elevated, 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1));
192
- transform: translateY(-4px);
193
-
194
- .stat-decoration {
195
- opacity: 1;
196
- }
239
+ box-shadow: var(--xto-shadow-base, 0 1px 3px rgba(31, 35, 41, 0.08), 0 4px 12px rgba(31, 35, 41, 0.06));
197
240
  }
198
241
 
199
242
  .stat-icon {
@@ -202,11 +245,13 @@ const systemInfo = ref([
202
245
  display: flex;
203
246
  align-items: center;
204
247
  justify-content: center;
205
- border-radius: var(--xto-border-radius-large, 8px);
248
+ background: var(--xto-fill-color, #F2F3F5);
249
+ border-radius: var(--xto-border-radius-large, 12px);
206
250
  flex-shrink: 0;
207
251
 
208
- span {
209
- font-size: 26px;
252
+ svg {
253
+ width: 24px;
254
+ height: 24px;
210
255
  }
211
256
  }
212
257
 
@@ -226,6 +271,8 @@ const systemInfo = ref([
226
271
  font-weight: 600;
227
272
  line-height: 1.2;
228
273
  margin-bottom: 8px;
274
+ color: var(--xto-color-text-primary, #1F2329);
275
+ font-variant-numeric: tabular-nums;
229
276
  }
230
277
 
231
278
  .stat-trend {
@@ -234,7 +281,7 @@ const systemInfo = ref([
234
281
  gap: 4px;
235
282
  font-size: 12px;
236
283
  padding: 2px 8px;
237
- border-radius: 12px;
284
+ border-radius: var(--xto-border-radius-small, 4px);
238
285
 
239
286
  svg {
240
287
  width: 14px;
@@ -242,26 +289,15 @@ const systemInfo = ref([
242
289
  }
243
290
 
244
291
  &.up {
245
- color: var(--xto-color-success, #2BC48A);
246
- background: var(--xto-color-success-lighter, #D1FAE5);
292
+ color: var(--xto-color-success, #00A870);
293
+ background: var(--xto-color-success-lighter, #EAFBF3);
247
294
  }
248
295
 
249
296
  &.down {
250
297
  color: var(--xto-color-danger, #F53F3F);
251
- background: var(--xto-color-danger-lighter, #FEE2E2);
298
+ background: var(--xto-color-danger-lighter, #FEF2F2);
252
299
  }
253
300
  }
254
-
255
- .stat-decoration {
256
- position: absolute;
257
- top: 0;
258
- right: 0;
259
- width: 100px;
260
- height: 100px;
261
- border-radius: 50%;
262
- opacity: 0;
263
- transition: opacity 0.3s ease;
264
- }
265
301
  }
266
302
 
267
303
  // 主体内容
@@ -293,12 +329,12 @@ const systemInfo = ref([
293
329
  color: var(--xto-color-text-placeholder, #A9AEB8);
294
330
  background: var(--xto-fill-color, #F2F3F5);
295
331
  padding: 4px 10px;
296
- border-radius: 12px;
332
+ border-radius: var(--xto-border-radius-small, 4px);
297
333
  }
298
334
 
299
335
  .section-link {
300
336
  font-size: 14px;
301
- color: var(--xto-color-primary, #12B6AF);
337
+ color: var(--xto-color-primary, #4F46E5);
302
338
  text-decoration: none;
303
339
  transition: color 0.2s;
304
340
 
@@ -311,9 +347,9 @@ const systemInfo = ref([
311
347
  // 快捷入口
312
348
  .quick-section {
313
349
  background: var(--xto-bg-color, #FFFFFF);
314
- border-radius: var(--xto-border-radius-large, 8px);
350
+ border-radius: var(--xto-border-radius-large, 12px);
315
351
  padding: 20px;
316
- box-shadow: var(--xto-shadow-subtle, 0 1px 2px 0 rgba(0,0,0,0.05));
352
+ box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
317
353
  }
318
354
 
319
355
  .quick-grid {
@@ -328,17 +364,15 @@ const systemInfo = ref([
328
364
  gap: 16px;
329
365
  padding: 16px;
330
366
  background: var(--xto-fill-color-light, #F7F8FA);
331
- border-radius: var(--xto-border-radius-base, 6px);
367
+ border-radius: var(--xto-border-radius-base, 8px);
332
368
  text-decoration: none;
333
- transition: all 0.2s ease;
369
+ transition: background-color 0.2s ease;
334
370
 
335
371
  &:hover {
336
- background: var(--xto-color-primary-light-6, #C7D2FE);
337
- transform: translateX(4px);
372
+ background: var(--xto-color-primary-light-9, #EDEDFC);
338
373
 
339
374
  .quick-arrow {
340
- color: var(--xto-color-primary, #12B6AF);
341
- transform: translateX(4px);
375
+ color: var(--xto-color-primary, #4F46E5);
342
376
  }
343
377
  }
344
378
 
@@ -349,9 +383,14 @@ const systemInfo = ref([
349
383
  align-items: center;
350
384
  justify-content: center;
351
385
  background: var(--xto-bg-color, #FFFFFF);
352
- border-radius: var(--xto-border-radius-base, 6px);
353
- font-size: 22px;
386
+ border-radius: var(--xto-border-radius-base, 8px);
387
+ color: var(--xto-color-primary, #4F46E5);
354
388
  flex-shrink: 0;
389
+
390
+ svg {
391
+ width: 20px;
392
+ height: 20px;
393
+ }
355
394
  }
356
395
 
357
396
  .quick-info {
@@ -378,7 +417,7 @@ const systemInfo = ref([
378
417
  align-items: center;
379
418
  justify-content: center;
380
419
  color: var(--xto-color-text-placeholder, #A9AEB8);
381
- transition: all 0.2s ease;
420
+ transition: color 0.2s ease;
382
421
 
383
422
  svg {
384
423
  width: 16px;
@@ -390,9 +429,9 @@ const systemInfo = ref([
390
429
  // 最近活动
391
430
  .activity-section {
392
431
  background: var(--xto-bg-color, #FFFFFF);
393
- border-radius: var(--xto-border-radius-large, 8px);
432
+ border-radius: var(--xto-border-radius-large, 12px);
394
433
  padding: 20px;
395
- box-shadow: var(--xto-shadow-subtle, 0 1px 2px 0 rgba(0,0,0,0.05));
434
+ box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
396
435
  }
397
436
 
398
437
  .activity-list {
@@ -405,8 +444,7 @@ const systemInfo = ref([
405
444
  align-items: flex-start;
406
445
  gap: 12px;
407
446
  padding: 14px 0;
408
- border-bottom: 1px solid var(--xto-border-color-lighter, #F2F3F5);
409
- position: relative;
447
+ border-bottom: 1px solid var(--xto-border-color-lighter, #EDEEF1);
410
448
 
411
449
  &:last-child {
412
450
  border-bottom: none;
@@ -424,11 +462,11 @@ const systemInfo = ref([
424
462
  font-weight: 500;
425
463
  flex-shrink: 0;
426
464
 
427
- &.success { background: var(--xto-color-success-lighter, #D1FAE5); color: var(--xto-color-success, #2BC48A); }
428
- &.warning { background: var(--xto-color-warning-lighter, #FEF3C7); color: var(--xto-color-warning, #FF7D00); }
429
- &.info { background: var(--xto-color-info-lighter, #E5E6EB); color: var(--xto-color-info, #86909C); }
430
- &.danger { background: var(--xto-color-danger-lighter, #FEE2E2); color: var(--xto-color-danger, #F53F3F); }
431
- &.primary { background: var(--xto-color-primary-light-6, #C7D2FE); color: var(--xto-color-primary, #12B6AF); }
465
+ &.success { background: var(--xto-color-success-lighter, #EAFBF3); color: var(--xto-color-success, #00A870); }
466
+ &.warning { background: var(--xto-color-warning-lighter, #FFF3E8); color: var(--xto-color-warning, #FF7D00); }
467
+ &.info { background: var(--xto-color-info-lighter, #F2F3F5); color: var(--xto-color-info, #86909C); }
468
+ &.danger { background: var(--xto-color-danger-lighter, #FEF2F2); color: var(--xto-color-danger, #F53F3F); }
469
+ &.primary { background: var(--xto-color-primary-light-9, #EDEDFC); color: var(--xto-color-primary, #4F46E5); }
432
470
  }
433
471
 
434
472
  .activity-content {
@@ -457,29 +495,12 @@ const systemInfo = ref([
457
495
  color: var(--xto-color-text-placeholder, #A9AEB8);
458
496
  }
459
497
 
460
- .activity-dot {
461
- position: absolute;
462
- left: -20px;
463
- top: 50%;
464
- transform: translateY(-50%);
465
- width: 8px;
466
- height: 8px;
467
- border-radius: 50%;
468
- opacity: 0.6;
469
-
470
- &.success { background: var(--xto-color-success, #2BC48A); }
471
- &.warning { background: var(--xto-color-warning, #FF7D00); }
472
- &.info { background: var(--xto-color-info, #86909C); }
473
- &.danger { background: var(--xto-color-danger, #F53F3F); }
474
- &.primary { background: var(--xto-color-primary, #12B6AF); }
475
- }
476
-
477
498
  // 系统信息
478
499
  .system-section {
479
500
  background: var(--xto-bg-color, #FFFFFF);
480
- border-radius: var(--xto-border-radius-large, 8px);
501
+ border-radius: var(--xto-border-radius-large, 12px);
481
502
  padding: 20px;
482
- box-shadow: var(--xto-shadow-subtle, 0 1px 2px 0 rgba(0,0,0,0.05));
503
+ box-shadow: var(--xto-shadow-subtle, 0 1px 2px rgba(31, 35, 41, 0.06));
483
504
  }
484
505
 
485
506
  .system-grid {
@@ -504,7 +525,7 @@ const systemInfo = ref([
504
525
  align-items: center;
505
526
  padding: 12px 16px;
506
527
  background: var(--xto-fill-color-light, #F7F8FA);
507
- border-radius: var(--xto-border-radius-base, 6px);
528
+ border-radius: var(--xto-border-radius-base, 8px);
508
529
 
509
530
  .info-label {
510
531
  font-size: 14px;
@@ -543,4 +564,4 @@ const systemInfo = ref([
543
564
  color: var(--xto-color-text-primary, #1F2329);
544
565
  }
545
566
  }
546
- </style>
567
+ </style>
@@ -38,10 +38,10 @@ const goBack = () => {
38
38
  <line x1="60" y1="55" x2="120" y2="55" stroke="var(--xto-border-color-light, #E5E6EB)" stroke-width="2"/>
39
39
  <line x1="60" y1="65" x2="100" y2="65" stroke="var(--xto-border-color-light, #E5E6EB)" stroke-width="2"/>
40
40
  <!-- 问号 -->
41
- <text x="100" y="75" text-anchor="middle" fill="var(--xto-color-primary, #12B6AF)" font-size="24" font-weight="600">?</text>
41
+ <text x="100" y="75" text-anchor="middle" fill="var(--xto-color-primary, #4F46E5)" font-size="24" font-weight="600">?</text>
42
42
  <!-- 搜索图标 -->
43
- <circle cx="150" cy="35" r="12" stroke="var(--xto-color-primary, #12B6AF)" stroke-width="2" fill="none"/>
44
- <line x1="158" y1="43" x2="168" y2="53" stroke="var(--xto-color-primary, #12B6AF)" stroke-width="2" stroke-linecap="round"/>
43
+ <circle cx="150" cy="35" r="12" stroke="var(--xto-color-primary, #4F46E5)" stroke-width="2" fill="none"/>
44
+ <line x1="158" y1="43" x2="168" y2="53" stroke="var(--xto-color-primary, #4F46E5)" stroke-width="2" stroke-linecap="round"/>
45
45
  </svg>
46
46
  </div>
47
47
 
@@ -117,7 +117,7 @@ const goBack = () => {
117
117
  height: 400px;
118
118
  top: -100px;
119
119
  right: -100px;
120
- background: var(--xto-color-primary, #12B6AF);
120
+ background: var(--xto-color-primary, #4F46E5);
121
121
  }
122
122
 
123
123
  &.circle-2 {
@@ -134,7 +134,7 @@ const goBack = () => {
134
134
  top: 50%;
135
135
  left: 50%;
136
136
  transform: translate(-50%, -50%);
137
- background: var(--xto-color-primary-light-3, #51DAD3);
137
+ background: var(--xto-color-primary-light-3, #847DEC);
138
138
  }
139
139
  }
140
140
  }
@@ -164,7 +164,7 @@ const goBack = () => {
164
164
  display: flex;
165
165
  align-items: center;
166
166
  justify-content: center;
167
- background: linear-gradient(135deg, var(--xto-color-primary, #12B6AF) 0%, var(--xto-color-primary-light-1, #17C3BB) 100%);
167
+ background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5) 0%, var(--xto-color-primary-light-1, #6158E7) 100%);
168
168
  border-radius: 50%;
169
169
 
170
170
  .zero-inner {
@@ -244,7 +244,7 @@ const goBack = () => {
244
244
  transform: translateY(-50%);
245
245
  width: 6px;
246
246
  height: 6px;
247
- background: var(--xto-color-primary, #12B6AF);
247
+ background: var(--xto-color-primary, #4F46E5);
248
248
  border-radius: 50%;
249
249
  opacity: 0.6;
250
250
  }
@@ -142,8 +142,6 @@ const handleLogin = async () => {
142
142
  <!-- 背景装饰 -->
143
143
  <div class="brand-bg">
144
144
  <div class="bg-grid"></div>
145
- <div class="bg-glow"></div>
146
- <div class="bg-pattern"></div>
147
145
  </div>
148
146
  </div>
149
147
 
@@ -255,14 +253,14 @@ const handleLogin = async () => {
255
253
  background: var(--xto-bg-color-page, #F7F8FA);
256
254
  }
257
255
 
258
- // 左侧品牌区域(淡紫蓝渐变网格背景,纯 CSS 无图片资源)
256
+ // 左侧品牌区域(企业级纯色品牌底 + 细网格纹理)
259
257
  .login-brand {
260
258
  flex: 1;
261
259
  position: relative;
262
260
  display: flex;
263
261
  align-items: center;
264
262
  justify-content: center;
265
- background: linear-gradient(135deg, #095755 0%, #0B6B67 45%, #12B6AF 100%);
263
+ background: var(--xto-color-primary-dark-1, #4338CA);
266
264
  overflow: hidden;
267
265
 
268
266
  @media (max-width: 992px) {
@@ -323,14 +321,12 @@ const handleLogin = async () => {
323
321
  align-items: flex-start;
324
322
  gap: 16px;
325
323
  padding: 16px;
326
- background: rgba(255, 255, 255, 0.1);
327
- border-radius: var(--xto-border-radius-large, 8px);
328
- backdrop-filter: blur(10px);
329
- transition: all 0.3s ease;
324
+ background: rgba(255, 255, 255, 0.08);
325
+ border-radius: var(--xto-border-radius-large, 12px);
326
+ transition: background-color 0.2s ease;
330
327
 
331
328
  &:hover {
332
- background: rgba(255, 255, 255, 0.15);
333
- transform: translateX(8px);
329
+ background: rgba(255, 255, 255, 0.14);
334
330
  }
335
331
  }
336
332
 
@@ -408,33 +404,9 @@ const handleLogin = async () => {
408
404
  linear-gradient(90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px);
409
405
  background-size: 28px 28px, 56px 56px, 56px 56px;
410
406
  }
411
-
412
- .bg-glow {
413
- position: absolute;
414
- top: -20%;
415
- right: -10%;
416
- width: 60%;
417
- height: 60%;
418
- background: radial-gradient(circle, rgba(147, 197, 253, 0.35) 0%, transparent 70%);
419
- animation: glow-pulse 8s ease-in-out infinite;
420
- }
421
-
422
- .bg-pattern {
423
- position: absolute;
424
- bottom: -10%;
425
- left: -10%;
426
- width: 40%;
427
- height: 40%;
428
- background: radial-gradient(circle, rgba(196, 181, 253, 0.28) 0%, transparent 60%);
429
- }
430
407
  }
431
408
  }
432
409
 
433
- @keyframes glow-pulse {
434
- 0%, 100% { opacity: 0.6; transform: scale(1); }
435
- 50% { opacity: 1; transform: scale(1.1); }
436
- }
437
-
438
410
  // 右侧登录区域
439
411
  .login-form-section {
440
412
  width: 500px;
@@ -507,12 +479,12 @@ const handleLogin = async () => {
507
479
 
508
480
  .forgot-link {
509
481
  font-size: 14px;
510
- color: var(--xto-color-primary, #12B6AF);
482
+ color: var(--xto-color-primary, #4F46E5);
511
483
  text-decoration: none;
512
484
  transition: color 0.2s;
513
485
 
514
486
  &:hover {
515
- color: var(--xto-color-primary-dark-1, #0D7F7A);
487
+ color: var(--xto-color-primary-dark-1, #4338CA);
516
488
  }
517
489
  }
518
490
  }
@@ -527,12 +499,7 @@ const handleLogin = async () => {
527
499
  transition: all 0.3s ease;
528
500
 
529
501
  &:hover:not(:disabled) {
530
- transform: translateY(-2px);
531
- box-shadow: 0 4px 12px rgba(29, 78, 216, 0.35);
532
- }
533
-
534
- &:active:not(:disabled) {
535
- transform: translateY(0);
502
+ background-color: var(--xto-color-primary-light-1, #6158E7);
536
503
  }
537
504
  }
538
505
 
@@ -573,8 +540,8 @@ const handleLogin = async () => {
573
540
  }
574
541
 
575
542
  &:hover {
576
- background: var(--xto-color-primary-light-8, #DDF6F4);
577
- color: var(--xto-color-primary, #12B6AF);
543
+ background: var(--xto-color-primary-light-8, #DCDAFC);
544
+ color: var(--xto-color-primary, #4F46E5);
578
545
  transform: translateY(-2px);
579
546
  }
580
547
  }
@@ -191,14 +191,14 @@ const handleSubmit = async () => {
191
191
  // 菜单图标
192
192
  const getMenuIcon = (icon?: string) => {
193
193
  const iconMap: Record<string, string> = {
194
- dashboard: '📊',
195
- system: '⚙️',
196
- user: '👤',
197
- role: '👥',
198
- menu: '📋',
199
- setting: '🔧'
194
+ dashboard: 'M4 5h16v11H4zM9 20h6M12 16v4',
195
+ system: 'M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm7.4-3c0-.4 0-.8-.1-1.2l2-1.6-2-3.4-2.4 1a7.6 7.6 0 0 0-2-1.2L14.5 3h-5l-.4 2.6a7.6 7.6 0 0 0-2 1.2l-2.4-1-2 3.4 2 1.6a7.4 7.4 0 0 0 0 2.4l-2 1.6 2 3.4 2.4-1a7.6 7.6 0 0 0 2 1.2l.4 2.6h5l.4-2.6a7.6 7.6 0 0 0 2-1.2l2.4 1 2-3.4-2-1.6c.1-.4.1-.8.1-1.2Z',
196
+ user: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm-7 8a7 7 0 0 1 14 0',
197
+ role: 'M8 11a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm8 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM2 19a6 6 0 0 1 12 0m2-6a6 6 0 0 1 6 6',
198
+ menu: 'M4 6h16M4 12h16M4 18h10',
199
+ setting: 'M4 6h16M4 12h16M4 18h16'
200
200
  }
201
- return iconMap[icon || ''] || '📄'
201
+ return iconMap[icon || ''] || 'M4 6h16M4 12h16M4 18h10'
202
202
  }
203
203
 
204
204
  // 获取类型标签类型
@@ -289,12 +289,12 @@ onMounted(() => {
289
289
  <tr class="data-row tree-row--level-0">
290
290
  <td class="col-name">
291
291
  <div class="menu-info">
292
- <span class="menu-icon-wrapper">{{ getMenuIcon(menu.icon) }}</span>
292
+ <span class="menu-icon-wrapper"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(menu.icon)" /></svg></span>
293
293
  <span class="menu-title" @click="handleEdit(menu)">{{ menu.title }}</span>
294
294
  </div>
295
295
  </td>
296
296
  <td class="col-icon">
297
- <span class="icon-text">{{ getMenuIcon(menu.icon) }}</span>
297
+ <span class="icon-text"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(menu.icon)" /></svg></span>
298
298
  </td>
299
299
  <td class="col-path">
300
300
  <code class="path-code">{{ menu.path }}</code>
@@ -341,12 +341,12 @@ onMounted(() => {
341
341
  <div class="menu-info">
342
342
  <span class="tree-indent"></span>
343
343
  <span class="tree-line"></span>
344
- <span class="menu-icon-wrapper">{{ getMenuIcon(child.icon) }}</span>
344
+ <span class="menu-icon-wrapper"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(child.icon)" /></svg></span>
345
345
  <span class="menu-title" @click="handleEdit(child)">{{ child.title }}</span>
346
346
  </div>
347
347
  </td>
348
348
  <td class="col-icon">
349
- <span class="icon-text">{{ getMenuIcon(child.icon) }}</span>
349
+ <span class="icon-text"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path :d="getMenuIcon(child.icon)" /></svg></span>
350
350
  </td>
351
351
  <td class="col-path">
352
352
  <code class="path-code">{{ child.path }}</code>
@@ -503,7 +503,7 @@ onMounted(() => {
503
503
  transition: background-color 0.2s;
504
504
 
505
505
  &:hover {
506
- background: var(--xto-color-primary-light-6, #C7D2FE);
506
+ background: var(--xto-color-primary-light-6, #CAC7F9);
507
507
  }
508
508
  }
509
509
 
@@ -534,7 +534,7 @@ onMounted(() => {
534
534
  width: 32px;
535
535
  height: 32px;
536
536
  border: 3px solid var(--xto-border-color-lighter, #F2F3F5);
537
- border-top-color: var(--xto-color-primary, #12B6AF);
537
+ border-top-color: var(--xto-color-primary, #4F46E5);
538
538
  border-radius: 50%;
539
539
  animation: spin 0.8s linear infinite;
540
540
  }
@@ -596,7 +596,7 @@ onMounted(() => {
596
596
  transition: color 0.2s;
597
597
 
598
598
  &:hover {
599
- color: var(--xto-color-primary, #12B6AF);
599
+ color: var(--xto-color-primary, #4F46E5);
600
600
  }
601
601
  }
602
602
 
@@ -432,7 +432,7 @@ onMounted(() => {
432
432
  transition: background-color 0.2s;
433
433
 
434
434
  &:hover {
435
- background: var(--xto-color-primary-light-6, #C7D2FE);
435
+ background: var(--xto-color-primary-light-6, #CAC7F9);
436
436
  }
437
437
  }
438
438
 
@@ -463,7 +463,7 @@ onMounted(() => {
463
463
  width: 32px;
464
464
  height: 32px;
465
465
  border: 3px solid var(--xto-border-color-lighter, #F2F3F5);
466
- border-top-color: var(--xto-color-primary, #12B6AF);
466
+ border-top-color: var(--xto-color-primary, #4F46E5);
467
467
  border-radius: 50%;
468
468
  animation: spin 0.8s linear infinite;
469
469
  }
@@ -458,7 +458,7 @@ onMounted(() => {
458
458
  transition: background-color 0.2s;
459
459
 
460
460
  &:hover {
461
- background: var(--xto-color-primary-light-6, #A5B4FC);
461
+ background: var(--xto-color-primary-light-6, #B9B5F5);
462
462
  }
463
463
  }
464
464
 
@@ -489,7 +489,7 @@ onMounted(() => {
489
489
  width: 32px;
490
490
  height: 32px;
491
491
  border: 3px solid var(--xto-border-color-lighter, #F2F3F5);
492
- border-top-color: var(--xto-color-primary, #12B6AF);
492
+ border-top-color: var(--xto-color-primary, #4F46E5);
493
493
  border-radius: 50%;
494
494
  animation: spin 0.8s linear infinite;
495
495
  }
@@ -532,7 +532,7 @@ onMounted(() => {
532
532
  display: flex;
533
533
  align-items: center;
534
534
  justify-content: center;
535
- background: linear-gradient(135deg, var(--xto-color-primary, #12B6AF) 0%, var(--xto-color-primary-light-1, #17C3BB) 100%);
535
+ background: linear-gradient(135deg, var(--xto-color-primary, #4F46E5) 0%, var(--xto-color-primary-light-1, #6158E7) 100%);
536
536
  border-radius: 50%;
537
537
  font-size: 16px;
538
538
  font-weight: 500;