@robot-admin/layout 2.0.2 → 2.2.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.
@@ -0,0 +1,706 @@
1
+ /**
2
+ * @robot-admin/layout
3
+ *
4
+ * 布局全局样式 - 所有布局共享的基础样式
5
+ * 包含:布局容器、内容区、主题适配、侧边栏基础、菜单毛玻璃效果、折叠菜单、过渡动画
6
+ *
7
+ * CSS 变量依赖(消费方需定义):
8
+ * --app-bg-body : 页面背景色
9
+ * --app-bg-content : 内容区背景色
10
+ * --app-bg-surface : 卡片/面板背景色
11
+ * --app-menu-bg : 菜单背景色
12
+ * --app-text-primary : 主文字色
13
+ * --app-text-secondary: 次文字色
14
+ * --app-border-color : 边框色
15
+ * --primary-color : 主题色
16
+ */
17
+
18
+ // ==================== 🎨 菜单样式自定义变量(可在主项目覆盖)====================
19
+ .layout-container {
20
+ // 菜单项圆角
21
+ --menu-border-radius: 10px;
22
+
23
+ // 一级菜单父项激活效果(子菜单展开状态)- 较淡
24
+ --menu-parent-gradient-start: rgba(99, 102, 241, 0.10);
25
+ --menu-parent-gradient-end: rgba(139, 92, 246, 0.06);
26
+ --menu-parent-border-color: rgba(99, 102, 241, 0.45);
27
+ --menu-parent-border-width: 2px;
28
+ --menu-parent-shadow: 0 2px 6px rgba(99, 102, 241, 0.1), 0 4px 12px rgba(99, 102, 241, 0.06);
29
+
30
+ // 二级菜单选中效果(当前页面)- 明显更亮,层级清晰
31
+ --menu-selected-gradient-start: rgba(99, 102, 241, 0.22);
32
+ --menu-selected-gradient-end: rgba(139, 92, 246, 0.16);
33
+ --menu-selected-border-color: rgba(99, 102, 241, 0.75);
34
+ --menu-selected-border-width: 3px;
35
+ --menu-selected-shadow: 0 2px 12px rgba(99, 102, 241, 0.22), 0 4px 24px rgba(99, 102, 241, 0.15);
36
+
37
+ // 毛玻璃效果强度
38
+ --menu-parent-blur: 14px;
39
+ --menu-parent-saturate: 130%;
40
+ --menu-selected-blur: 16px;
41
+ --menu-selected-saturate: 135%;
42
+ }
43
+
44
+ // ==================== 基础布局样式 ====================
45
+ .layout-container {
46
+ height: 100vh;
47
+ overflow: hidden;
48
+ display: flex;
49
+ flex-direction: column;
50
+ }
51
+
52
+ // ==================== 内容区域样式 ====================
53
+ .layout-container .content-with-header {
54
+ margin-top: 100px;
55
+ height: calc(100vh - 150px);
56
+ }
57
+
58
+ .layout-container .app-content {
59
+ background-color: var(--app-bg-content);
60
+ }
61
+
62
+ .layout-container .n-layout-content {
63
+ display: flex;
64
+ flex-direction: column;
65
+ flex: 1;
66
+ overflow-x: hidden;
67
+ }
68
+
69
+ .main-content {
70
+ flex: 1;
71
+ padding: 16px;
72
+ overflow-y: auto;
73
+ overflow-x: hidden;
74
+ width: 100%;
75
+ border-radius: 8px;
76
+ }
77
+
78
+ // ==================== 主题相关样式 ====================
79
+ [data-theme='light'] .layout-container .light-theme,
80
+ .layout-container .light-theme {
81
+ background-color: var(--app-bg-body);
82
+ }
83
+
84
+ [data-theme='dark'] .layout-container .dark-theme,
85
+ .layout-container .dark-theme {
86
+ background-color: var(--app-bg-body);
87
+ }
88
+
89
+ .layout-container.light-mode .n-layout .n-layout-scroll-container {
90
+ background-color: var(--app-bg-surface);
91
+ border-radius: 10px;
92
+ }
93
+
94
+ .layout-container.dark-mode .n-layout .n-layout-scroll-container,
95
+ .layout-container.system-mode .n-layout .n-layout-scroll-container {
96
+ background-color: var(--app-bg-surface);
97
+ }
98
+
99
+ // ==================== 侧边栏和菜单样式 ====================
100
+ .layout-sider {
101
+ transform: translateZ(0);
102
+ backface-visibility: hidden;
103
+ contain: layout style paint;
104
+ }
105
+
106
+ .layout-sider.light-theme {
107
+ background-color: var(--app-menu-bg);
108
+ }
109
+
110
+ .layout-sider.dark-theme {
111
+ background-color: var(--app-menu-bg);
112
+ }
113
+
114
+ .layout-sider .n-scrollbar-rail {
115
+ width: 0 !important;
116
+ }
117
+
118
+ .layout-sider .n-scrollbar-content {
119
+ padding-right: 0 !important;
120
+ }
121
+
122
+ .layout-container .n-layout-sider {
123
+ flex-shrink: 0;
124
+ height: 100%;
125
+ display: flex;
126
+ flex-direction: column;
127
+ overflow: hidden;
128
+ }
129
+
130
+ .menu-scroll-container {
131
+ height: calc(100vh - 56px);
132
+ overflow-y: scroll;
133
+ scrollbar-width: none;
134
+ -ms-overflow-style: none;
135
+ flex: 1;
136
+ display: flex;
137
+ flex-direction: column;
138
+ }
139
+
140
+ .menu-scroll-container::-webkit-scrollbar {
141
+ display: none;
142
+ }
143
+
144
+ .layout-container .n-menu.n-menu--vertical {
145
+ flex: 1;
146
+ min-height: min-content;
147
+ overflow-y: auto;
148
+ overflow-x: hidden;
149
+ }
150
+
151
+ // ==================== 菜单图标和文字样式 ====================
152
+ .layout-container .n-menu-item-content__icon {
153
+ display: flex;
154
+ align-items: center;
155
+ justify-content: center;
156
+ vertical-align: middle;
157
+ width: 18px !important;
158
+ height: 18px !important;
159
+ margin-right: 10px;
160
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
161
+ font-size: 18px !important;
162
+ }
163
+
164
+ .layout-container .n-menu-item-content__icon .n-icon {
165
+ width: 18px !important;
166
+ height: 18px !important;
167
+ font-size: 18px !important;
168
+ }
169
+
170
+ .layout-container .n-menu-item-content__icon svg {
171
+ width: 18px !important;
172
+ height: 18px !important;
173
+ }
174
+
175
+ .layout-container .n-menu-item-content-header {
176
+ font-size: 14px;
177
+ font-weight: 500;
178
+ letter-spacing: 0.2px;
179
+ line-height: 1.5;
180
+ }
181
+
182
+ .layout-container .n-menu-item-content__arrow {
183
+ font-size: 14px;
184
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
185
+ }
186
+
187
+ // ==================== 🎨 毛玻璃质感菜单效果(性能优化版)====================
188
+
189
+ /* 菜单项基础样式 - 卡片质感默认状态 */
190
+ .layout-container .n-menu-item {
191
+ border-radius: 0;
192
+ position: relative;
193
+ overflow: visible;
194
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
195
+ will-change: transform;
196
+
197
+ &::before {
198
+ content: '';
199
+ position: absolute;
200
+ top: 0;
201
+ left: 0;
202
+ right: 0;
203
+ bottom: 0;
204
+ background: linear-gradient(135deg,
205
+ rgba(255, 255, 255, 0.08) 0%,
206
+ rgba(255, 255, 255, 0.04) 100%);
207
+ border-radius: 10px;
208
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
209
+ z-index: -1;
210
+ box-shadow:
211
+ 0 2px 4px rgba(0, 0, 0, 0.08),
212
+ inset 0 1px 0 rgba(255, 255, 255, 0.1);
213
+ }
214
+ }
215
+
216
+ /* 菜单项内容容器 - 卡片质感 */
217
+ .layout-container .n-menu-item-content {
218
+ border-radius: var(--menu-border-radius, 10px);
219
+ background: transparent;
220
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
221
+ position: relative;
222
+ padding: 10px 16px;
223
+
224
+ &::after {
225
+ content: '';
226
+ position: absolute;
227
+ top: 0;
228
+ left: 0;
229
+ right: 0;
230
+ bottom: 0;
231
+ border: 1px solid rgba(255, 255, 255, 0.06);
232
+ border-left: 2px solid transparent;
233
+ border-radius: var(--menu-border-radius, 10px);
234
+ pointer-events: none;
235
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
236
+ }
237
+ }
238
+
239
+ /* Hover 状态 - 增强卡片效果 */
240
+ .layout-container .n-menu-item:hover {
241
+ transform: translateX(2px);
242
+
243
+ &::before {
244
+ background: rgba(255, 255, 255, 0.1);
245
+ border-radius: 10px;
246
+ box-shadow:
247
+ 0 4px 16px rgba(0, 0, 0, 0.12),
248
+ inset 0 1px 0 rgba(255, 255, 255, 0.12);
249
+ }
250
+ }
251
+
252
+ .layout-container .n-menu-item:hover .n-menu-item-content {
253
+ backdrop-filter: blur(12px);
254
+ -webkit-backdrop-filter: blur(12px);
255
+ border-radius: 10px;
256
+
257
+ &::after {
258
+ border-left-color: rgba(99, 102, 241, 0.4);
259
+ border-radius: 10px;
260
+ box-shadow:
261
+ 0 0 15px rgba(99, 102, 241, 0.15),
262
+ inset 0 1px 1px rgba(255, 255, 255, 0.1);
263
+ }
264
+ }
265
+
266
+ .layout-container .n-menu-item:hover .n-menu-item-content__icon {
267
+ transform: scale(1.08);
268
+ color: var(--n-item-icon-color-active-hover);
269
+ }
270
+
271
+ /* Active/选中状态 - 二级菜单选中(当前页面)- 略强玻璃质感 */
272
+ .layout-container .n-menu-item--selected,
273
+ .layout-container .n-menu-item-content--selected {
274
+ background: transparent !important; /* 覆盖 Naive UI 默认背景 */
275
+
276
+ &::before {
277
+ background: linear-gradient(135deg,
278
+ var(--menu-selected-gradient-start, rgba(99, 102, 241, 0.22)) 0%,
279
+ var(--menu-selected-gradient-end, rgba(139, 92, 246, 0.16)) 100%) !important;
280
+ border-radius: var(--menu-border-radius, 10px);
281
+ box-shadow:
282
+ var(--menu-selected-shadow, 0 2px 12px rgba(99, 102, 241, 0.22), 0 4px 24px rgba(99, 102, 241, 0.15)),
283
+ inset 0 1px 2px rgba(99, 102, 241, 0.12),
284
+ inset 0 0 0 1px rgba(255, 255, 255, 0.08);
285
+ }
286
+ }
287
+
288
+ .layout-container .n-menu-item--selected .n-menu-item-content,
289
+ .layout-container .n-menu-item-content--selected {
290
+ background: transparent !important; /* 覆盖 Naive UI 默认背景 */
291
+ backdrop-filter: blur(var(--menu-selected-blur, 16px)) saturate(var(--menu-selected-saturate, 135%));
292
+ -webkit-backdrop-filter: blur(var(--menu-selected-blur, 16px)) saturate(var(--menu-selected-saturate, 135%));
293
+
294
+ &::after {
295
+ border-left: var(--menu-selected-border-width, 3px) solid var(--menu-selected-border-color, rgba(99, 102, 241, 0.75));
296
+ border-radius: var(--menu-border-radius, 10px);
297
+ box-shadow:
298
+ 0 0 14px rgba(99, 102, 241, 0.25),
299
+ inset 0 1px 2px rgba(255, 255, 255, 0.12);
300
+ }
301
+ }
302
+
303
+ .layout-container .n-menu-item--selected .n-menu-item-content__icon {
304
+ filter: drop-shadow(0 0 6px rgba(99, 102, 241, 0.5));
305
+ transform: scale(1.05);
306
+ color: var(--n-item-icon-color-active);
307
+ }
308
+
309
+ /* Active 按下状态 */
310
+ .layout-container .n-menu-item:active {
311
+ transform: scale(0.98);
312
+ }
313
+
314
+ /* 子菜单父项样式 - 一级菜单展开状态(较淡玻璃质感)*/
315
+ .layout-container .n-menu-item-content--child-active {
316
+ background: transparent !important; /* 覆盖 Naive UI 默认背景 */
317
+
318
+ &::before {
319
+ background: linear-gradient(135deg,
320
+ var(--menu-parent-gradient-start, rgba(99, 102, 241, 0.10)) 0%,
321
+ var(--menu-parent-gradient-end, rgba(139, 92, 246, 0.06)) 100%) !important;
322
+ border-radius: var(--menu-border-radius, 10px);
323
+ box-shadow:
324
+ var(--menu-parent-shadow, 0 2px 6px rgba(99, 102, 241, 0.1), 0 4px 12px rgba(99, 102, 241, 0.06)),
325
+ inset 0 1px 2px rgba(99, 102, 241, 0.06),
326
+ inset 0 0 0 1px rgba(255, 255, 255, 0.05);
327
+ }
328
+
329
+ &::after {
330
+ border-left: var(--menu-parent-border-width, 2px) solid var(--menu-parent-border-color, rgba(99, 102, 241, 0.45));
331
+ border-radius: var(--menu-border-radius, 10px);
332
+ }
333
+
334
+ backdrop-filter: blur(var(--menu-parent-blur, 14px)) saturate(var(--menu-parent-saturate, 130%));
335
+ -webkit-backdrop-filter: blur(var(--menu-parent-blur, 14px)) saturate(var(--menu-parent-saturate, 130%));
336
+ }
337
+
338
+ /* 一级菜单项对齐 */
339
+ .layout-container .n-menu > .n-menu-item,
340
+ .layout-container .n-menu > .n-submenu {
341
+ margin: 4px 12px;
342
+ }
343
+
344
+ /* 二级及以下菜单项 */
345
+ .layout-container .n-submenu-children .n-menu-item {
346
+ margin: 4px 0;
347
+ }
348
+
349
+ .layout-container .n-submenu-children .n-menu-item-content {
350
+ padding-left: 46px;
351
+ }
352
+
353
+ // ==================== 主题优化 ====================
354
+ .dark-theme {
355
+ color-scheme: dark;
356
+
357
+ .layout-container .n-menu-item::before {
358
+ background: linear-gradient(135deg,
359
+ rgba(255, 255, 255, 0.08) 0%,
360
+ rgba(255, 255, 255, 0.04) 100%);
361
+ box-shadow:
362
+ 0 2px 4px rgba(0, 0, 0, 0.12),
363
+ inset 0 1px 0 rgba(255, 255, 255, 0.08);
364
+ }
365
+
366
+ .layout-container .n-menu-item:hover::before {
367
+ background: linear-gradient(135deg,
368
+ rgba(255, 255, 255, 0.12) 0%,
369
+ rgba(255, 255, 255, 0.08) 100%);
370
+ }
371
+ }
372
+
373
+ .light-theme {
374
+ color-scheme: light;
375
+
376
+ .layout-container .n-menu-item::before {
377
+ background: linear-gradient(135deg,
378
+ rgba(255, 255, 255, 0.6) 0%,
379
+ rgba(255, 255, 255, 0.4) 100%);
380
+ box-shadow:
381
+ 0 2px 4px rgba(0, 0, 0, 0.04),
382
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
383
+ }
384
+
385
+ .layout-container .n-menu-item:hover::before {
386
+ background: linear-gradient(135deg,
387
+ rgba(255, 255, 255, 0.8) 0%,
388
+ rgba(255, 255, 255, 0.6) 100%);
389
+ }
390
+
391
+ .layout-container .n-menu-item-content::after {
392
+ border-color: rgba(0, 0, 0, 0.08);
393
+ }
394
+ }
395
+
396
+ // ==================== 折叠菜单样式 ====================
397
+ .layout-container .n-menu.n-menu--collapsed {
398
+ width: 64px !important;
399
+ display: flex;
400
+ flex-direction: column;
401
+ align-items: center;
402
+ }
403
+
404
+ .layout-container .n-menu.n-menu--collapsed .n-menu-item-content {
405
+ justify-content: center !important;
406
+ padding: 0 !important;
407
+ display: flex;
408
+ align-items: center;
409
+ width: 62px;
410
+ }
411
+
412
+ .layout-container .n-menu.n-menu--collapsed .n-icon {
413
+ margin-left: 40px !important;
414
+ margin-top: 4px !important;
415
+ }
416
+
417
+ .layout-container .n-menu.n-menu--collapsed .n-menu-item {
418
+ padding: 0 !important;
419
+ display: flex;
420
+ justify-content: center;
421
+ width: 100%;
422
+ }
423
+
424
+ .layout-container .n-menu.n-menu--collapsed .n-menu-item-content-header {
425
+ margin: 0 auto;
426
+ margin-top: -10px;
427
+ padding: 0;
428
+ }
429
+
430
+ .layout-container .n-menu.n-menu--collapsed .n-menu-item-content__icon {
431
+ margin-right: 0;
432
+ }
433
+
434
+ .layout-container
435
+ .n-menu.n-menu--collapsed
436
+ .n-menu-item-content--child-active
437
+ .n-menu-item-content__icon
438
+ {
439
+ color: var(--n-item-color-active) !important;
440
+ }
441
+
442
+ /* 折叠菜单选中状态 - 使用二级选中效果变量 */
443
+ .layout-container .n-menu.n-menu--collapsed .n-menu-item-content--child-active {
444
+ background: transparent !important; /* 覆盖 Naive UI 默认背景 */
445
+
446
+ &::before {
447
+ background: linear-gradient(135deg,
448
+ var(--menu-selected-gradient-start, rgba(99, 102, 241, 0.22)) 0%,
449
+ var(--menu-selected-gradient-end, rgba(139, 92, 246, 0.16)) 100%) !important;
450
+ border-radius: var(--menu-border-radius, 10px);
451
+ box-shadow:
452
+ var(--menu-selected-shadow, 0 2px 12px rgba(99, 102, 241, 0.22), 0 4px 24px rgba(99, 102, 241, 0.15)),
453
+ inset 0 1px 2px rgba(99, 102, 241, 0.12),
454
+ inset 0 0 0 1px rgba(255, 255, 255, 0.08);
455
+ }
456
+
457
+ backdrop-filter: blur(var(--menu-selected-blur, 16px)) saturate(var(--menu-selected-saturate, 135%));
458
+ -webkit-backdrop-filter: blur(var(--menu-selected-blur, 16px)) saturate(var(--menu-selected-saturate, 135%));
459
+
460
+ &::after {
461
+ border-radius: var(--menu-border-radius, 10px);
462
+ box-shadow:
463
+ 0 0 14px rgba(99, 102, 241, 0.25),
464
+ 0 0 20px rgba(99, 102, 241, 0.15);
465
+ }
466
+ }
467
+
468
+ /* 折叠菜单 Hover 效果 */
469
+ .layout-container .n-menu.n-menu--collapsed .n-menu-item:hover {
470
+ transform: scale(1.05);
471
+
472
+ &::before {
473
+ background: rgba(255, 255, 255, 0.1);
474
+ box-shadow:
475
+ 0 4px 16px rgba(0, 0, 0, 0.15),
476
+ inset 0 1px 0 rgba(255, 255, 255, 0.15);
477
+ }
478
+ }
479
+
480
+ /* 折叠菜单图标颜色 */
481
+ .n-menu--collapsed .n-menu-item-content__icon {
482
+ color: rgba(229, 231, 235, 0.9) !important;
483
+ }
484
+
485
+ // ==================== 其他辅助样式 ====================
486
+ .layout-container .n-layout {
487
+ width: 100%;
488
+ min-width: 0;
489
+ }
490
+
491
+ .no-horizontal-scroll {
492
+ overflow-x: hidden !important;
493
+ }
494
+
495
+ // ==================== 子菜单和菜单组毛玻璃效果 ====================
496
+ .layout-container .n-submenu {
497
+ margin: 4px 0;
498
+ }
499
+
500
+ .layout-container .n-submenu > .n-menu-item-content {
501
+ padding: 10px 16px;
502
+ }
503
+
504
+ .layout-container .n-submenu-children .n-menu-item {
505
+ margin: 2px 0;
506
+ position: relative;
507
+
508
+ &::before {
509
+ content: none;
510
+ }
511
+ }
512
+
513
+ .layout-container .n-submenu-children .n-menu-item-content {
514
+ padding: 8px 16px 8px 46px;
515
+ font-size: 13px;
516
+ }
517
+
518
+ .layout-container .n-submenu-children .n-menu-item-content__icon {
519
+ width: 16px !important;
520
+ height: 16px !important;
521
+ font-size: 16px !important;
522
+ margin-right: 8px;
523
+ }
524
+
525
+ .layout-container .n-submenu-children .n-menu-item-content__icon .n-icon {
526
+ width: 16px !important;
527
+ height: 16px !important;
528
+ font-size: 16px !important;
529
+ }
530
+
531
+ .layout-container .n-submenu-children .n-menu-item-content__icon svg {
532
+ width: 16px !important;
533
+ height: 16px !important;
534
+ }
535
+
536
+ .layout-container .n-submenu-children .n-menu-item:hover {
537
+ transform: translateX(2px);
538
+ }
539
+
540
+ .layout-container .n-submenu-children {
541
+ background: rgba(0, 0, 0, 0.05);
542
+ backdrop-filter: blur(6px);
543
+ -webkit-backdrop-filter: blur(6px);
544
+ margin: 2px 0;
545
+ padding: 4px 0;
546
+ border-left: 2px solid rgba(99, 102, 241, 0.3);
547
+ }
548
+
549
+ /* 菜单组标题 */
550
+ .layout-container .n-menu-item-group-title {
551
+ font-size: 11px;
552
+ font-weight: 600;
553
+ text-transform: uppercase;
554
+ letter-spacing: 1.2px;
555
+ padding: 12px 16px 6px;
556
+ opacity: 0.5;
557
+ position: relative;
558
+
559
+ &::after {
560
+ content: '';
561
+ position: absolute;
562
+ bottom: 0;
563
+ left: 16px;
564
+ right: 16px;
565
+ height: 1px;
566
+ background: linear-gradient(to right,
567
+ transparent,
568
+ rgba(99, 102, 241, 0.2),
569
+ transparent);
570
+ }
571
+ }
572
+
573
+ /* 菜单分割线 */
574
+ .layout-container .n-menu-divider {
575
+ margin: 8px 16px;
576
+ height: 1px;
577
+ background: linear-gradient(to right,
578
+ transparent,
579
+ rgba(255, 255, 255, 0.1),
580
+ transparent);
581
+ backdrop-filter: blur(4px);
582
+ -webkit-backdrop-filter: blur(4px);
583
+ }
584
+
585
+ /* 加载状态优化 */
586
+ .layout-container .n-menu-item.n-menu-item--loading {
587
+ &::before {
588
+ background: linear-gradient(90deg,
589
+ rgba(99, 102, 241, 0.1) 0%,
590
+ rgba(139, 92, 246, 0.2) 50%,
591
+ rgba(99, 102, 241, 0.1) 100%);
592
+ background-size: 200% 100%;
593
+ animation: shimmer 2s infinite;
594
+ }
595
+ }
596
+
597
+ @keyframes shimmer {
598
+ 0% {
599
+ background-position: -200% 0;
600
+ }
601
+ 100% {
602
+ background-position: 200% 0;
603
+ }
604
+ }
605
+
606
+ /* 禁用状态 */
607
+ .layout-container .n-menu-item.n-menu-item--disabled {
608
+ opacity: 0.4;
609
+ filter: grayscale(0.5);
610
+ cursor: not-allowed;
611
+
612
+ &::before {
613
+ background: rgba(255, 255, 255, 0.01);
614
+ }
615
+
616
+ &:hover {
617
+ transform: none;
618
+ }
619
+ }
620
+
621
+ // ==================== ⚡ 页面切换过渡动画 ====================
622
+
623
+ // 滑动效果
624
+ .fade-slide-enter-active,
625
+ .fade-slide-leave-active {
626
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
627
+ }
628
+
629
+ .fade-slide-enter-from {
630
+ opacity: 0;
631
+ transform: translateX(20px);
632
+ }
633
+
634
+ .fade-slide-leave-to {
635
+ opacity: 0;
636
+ transform: translateX(-20px);
637
+ }
638
+
639
+ // 淡入效果
640
+ .fade-transform-enter-active,
641
+ .fade-transform-leave-active {
642
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
643
+ }
644
+
645
+ .fade-transform-enter-from {
646
+ opacity: 0;
647
+ transform: scale(0.95);
648
+ }
649
+
650
+ .fade-transform-leave-to {
651
+ opacity: 0;
652
+ transform: scale(1.05);
653
+ }
654
+
655
+ // 缩放效果
656
+ .fade-zoom-enter-active,
657
+ .fade-zoom-leave-active {
658
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
659
+ }
660
+
661
+ .fade-zoom-enter-from {
662
+ opacity: 0;
663
+ transform: scale(0.8);
664
+ }
665
+
666
+ .fade-zoom-leave-to {
667
+ opacity: 0;
668
+ transform: scale(0.8);
669
+ }
670
+
671
+ // ==================== 🎨 布局开发中提示样式 ====================
672
+
673
+ .layout-coming-soon {
674
+ display: flex;
675
+ align-items: center;
676
+ justify-content: center;
677
+ height: 100vh;
678
+ background-color: var(--app-bg-content);
679
+ }
680
+
681
+ .coming-soon-content {
682
+ text-align: center;
683
+ max-width: 400px;
684
+ padding: 40px;
685
+ border-radius: 12px;
686
+ background-color: var(--app-bg-surface);
687
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
688
+ }
689
+
690
+ .coming-soon-icon {
691
+ font-size: 64px;
692
+ margin-bottom: 16px;
693
+ }
694
+
695
+ .coming-soon-title {
696
+ font-size: 24px;
697
+ font-weight: 600;
698
+ margin-bottom: 8px;
699
+ color: var(--app-text-primary);
700
+ }
701
+
702
+ .coming-soon-desc {
703
+ font-size: 16px;
704
+ color: var(--app-text-secondary);
705
+ line-height: 1.5;
706
+ }