@robot-admin/layout 3.1.0 → 3.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.
@@ -19,21 +19,23 @@
19
19
  .layout-container {
20
20
  // 菜单项圆角
21
21
  --menu-border-radius: 10px;
22
-
22
+
23
23
  // 一级菜单父项激活效果(子菜单展开状态)- 较淡
24
- --menu-parent-gradient-start: rgba(99, 102, 241, 0.10);
24
+ --menu-parent-gradient-start: rgba(99, 102, 241, 0.1);
25
25
  --menu-parent-gradient-end: rgba(139, 92, 246, 0.06);
26
26
  --menu-parent-border-color: rgba(99, 102, 241, 0.45);
27
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
-
28
+ --menu-parent-shadow:
29
+ 0 2px 6px rgba(99, 102, 241, 0.1), 0 4px 12px rgba(99, 102, 241, 0.06);
30
+
30
31
  // 二级菜单选中效果(当前页面)- 明显更亮,层级清晰
31
32
  --menu-selected-gradient-start: rgba(99, 102, 241, 0.22);
32
33
  --menu-selected-gradient-end: rgba(139, 92, 246, 0.16);
33
34
  --menu-selected-border-color: rgba(99, 102, 241, 0.75);
34
35
  --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
-
36
+ --menu-selected-shadow:
37
+ 0 2px 12px rgba(99, 102, 241, 0.22), 0 4px 24px rgba(99, 102, 241, 0.15);
38
+
37
39
  // 毛玻璃效果强度
38
40
  --menu-parent-blur: 14px;
39
41
  --menu-parent-saturate: 130%;
@@ -66,7 +68,7 @@
66
68
  overflow-x: hidden;
67
69
  }
68
70
 
69
- .main-content {
71
+ :where(.layout-container) .main-content {
70
72
  flex: 1;
71
73
  padding: 16px;
72
74
  overflow-y: auto;
@@ -76,12 +78,12 @@
76
78
  }
77
79
 
78
80
  // ==================== 主题相关样式 ====================
79
- [data-theme='light'] .layout-container .light-theme,
81
+ [data-theme="light"] .layout-container .light-theme,
80
82
  .layout-container .light-theme {
81
83
  background-color: var(--app-bg-body);
82
84
  }
83
85
 
84
- [data-theme='dark'] .layout-container .dark-theme,
86
+ [data-theme="dark"] .layout-container .dark-theme,
85
87
  .layout-container .dark-theme {
86
88
  background-color: var(--app-bg-body);
87
89
  }
@@ -97,25 +99,25 @@
97
99
  }
98
100
 
99
101
  // ==================== 侧边栏和菜单样式 ====================
100
- .layout-sider {
102
+ :where(.layout-container) .layout-sider {
101
103
  transform: translateZ(0);
102
104
  backface-visibility: hidden;
103
105
  contain: layout style paint;
104
106
  }
105
107
 
106
- .layout-sider.light-theme {
108
+ :where(.layout-container) .layout-sider.light-theme {
107
109
  background-color: var(--app-menu-bg);
108
110
  }
109
111
 
110
- .layout-sider.dark-theme {
112
+ :where(.layout-container) .layout-sider.dark-theme {
111
113
  background-color: var(--app-menu-bg);
112
114
  }
113
115
 
114
- .layout-sider .n-scrollbar-rail {
116
+ :where(.layout-container) .layout-sider .n-scrollbar-rail {
115
117
  width: 0 !important;
116
118
  }
117
119
 
118
- .layout-sider .n-scrollbar-content {
120
+ :where(.layout-container) .layout-sider .n-scrollbar-content {
119
121
  padding-right: 0 !important;
120
122
  }
121
123
 
@@ -127,7 +129,7 @@
127
129
  overflow: hidden;
128
130
  }
129
131
 
130
- .menu-scroll-container {
132
+ :where(.layout-container) .menu-scroll-container {
131
133
  height: calc(100vh - 56px);
132
134
  overflow-y: scroll;
133
135
  scrollbar-width: none;
@@ -137,7 +139,7 @@
137
139
  flex-direction: column;
138
140
  }
139
141
 
140
- .menu-scroll-container::-webkit-scrollbar {
142
+ :where(.layout-container) .menu-scroll-container::-webkit-scrollbar {
141
143
  display: none;
142
144
  }
143
145
 
@@ -195,15 +197,17 @@
195
197
  will-change: transform;
196
198
 
197
199
  &::before {
198
- content: '';
200
+ content: "";
199
201
  position: absolute;
200
202
  top: 0;
201
203
  left: 0;
202
204
  right: 0;
203
205
  bottom: 0;
204
- background: linear-gradient(135deg,
206
+ background: linear-gradient(
207
+ 135deg,
205
208
  rgba(255, 255, 255, 0.08) 0%,
206
- rgba(255, 255, 255, 0.04) 100%);
209
+ rgba(255, 255, 255, 0.04) 100%
210
+ );
207
211
  border-radius: 10px;
208
212
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
209
213
  z-index: -1;
@@ -222,7 +226,7 @@
222
226
  padding: 10px 16px;
223
227
 
224
228
  &::after {
225
- content: '';
229
+ content: "";
226
230
  position: absolute;
227
231
  top: 0;
228
232
  left: 0;
@@ -272,14 +276,20 @@
272
276
  .layout-container .n-menu-item--selected,
273
277
  .layout-container .n-menu-item-content--selected {
274
278
  background: transparent !important; /* 覆盖 Naive UI 默认背景 */
275
-
279
+
276
280
  &::before {
277
- background: linear-gradient(135deg,
281
+ background: linear-gradient(
282
+ 135deg,
278
283
  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;
284
+ var(--menu-selected-gradient-end, rgba(139, 92, 246, 0.16)) 100%
285
+ ) !important;
280
286
  border-radius: var(--menu-border-radius, 10px);
281
287
  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)),
288
+ var(
289
+ --menu-selected-shadow,
290
+ 0 2px 12px rgba(99, 102, 241, 0.22),
291
+ 0 4px 24px rgba(99, 102, 241, 0.15)
292
+ ),
283
293
  inset 0 1px 2px rgba(99, 102, 241, 0.12),
284
294
  inset 0 0 0 1px rgba(255, 255, 255, 0.08);
285
295
  }
@@ -288,11 +298,14 @@
288
298
  .layout-container .n-menu-item--selected .n-menu-item-content,
289
299
  .layout-container .n-menu-item-content--selected {
290
300
  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%));
301
+ backdrop-filter: blur(var(--menu-selected-blur, 16px))
302
+ saturate(var(--menu-selected-saturate, 135%));
303
+ -webkit-backdrop-filter: blur(var(--menu-selected-blur, 16px))
304
+ saturate(var(--menu-selected-saturate, 135%));
293
305
 
294
306
  &::after {
295
- border-left: var(--menu-selected-border-width, 3px) solid var(--menu-selected-border-color, rgba(99, 102, 241, 0.75));
307
+ border-left: var(--menu-selected-border-width, 3px) solid
308
+ var(--menu-selected-border-color, rgba(99, 102, 241, 0.75));
296
309
  border-radius: var(--menu-border-radius, 10px);
297
310
  box-shadow:
298
311
  0 0 14px rgba(99, 102, 241, 0.25),
@@ -314,25 +327,34 @@
314
327
  /* 子菜单父项样式 - 一级菜单展开状态(较淡玻璃质感)*/
315
328
  .layout-container .n-menu-item-content--child-active {
316
329
  background: transparent !important; /* 覆盖 Naive UI 默认背景 */
317
-
330
+
318
331
  &::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;
332
+ background: linear-gradient(
333
+ 135deg,
334
+ var(--menu-parent-gradient-start, rgba(99, 102, 241, 0.1)) 0%,
335
+ var(--menu-parent-gradient-end, rgba(139, 92, 246, 0.06)) 100%
336
+ ) !important;
322
337
  border-radius: var(--menu-border-radius, 10px);
323
338
  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)),
339
+ var(
340
+ --menu-parent-shadow,
341
+ 0 2px 6px rgba(99, 102, 241, 0.1),
342
+ 0 4px 12px rgba(99, 102, 241, 0.06)
343
+ ),
325
344
  inset 0 1px 2px rgba(99, 102, 241, 0.06),
326
345
  inset 0 0 0 1px rgba(255, 255, 255, 0.05);
327
346
  }
328
347
 
329
348
  &::after {
330
- border-left: var(--menu-parent-border-width, 2px) solid var(--menu-parent-border-color, rgba(99, 102, 241, 0.45));
349
+ border-left: var(--menu-parent-border-width, 2px) solid
350
+ var(--menu-parent-border-color, rgba(99, 102, 241, 0.45));
331
351
  border-radius: var(--menu-border-radius, 10px);
332
352
  }
333
353
 
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%));
354
+ backdrop-filter: blur(var(--menu-parent-blur, 14px))
355
+ saturate(var(--menu-parent-saturate, 130%));
356
+ -webkit-backdrop-filter: blur(var(--menu-parent-blur, 14px))
357
+ saturate(var(--menu-parent-saturate, 130%));
336
358
  }
337
359
 
338
360
  /* 一级菜单项对齐 */
@@ -351,41 +373,49 @@
351
373
  }
352
374
 
353
375
  // ==================== 主题优化 ====================
354
- .dark-theme {
376
+ :where(.layout-container) .dark-theme {
355
377
  color-scheme: dark;
356
378
 
357
379
  .layout-container .n-menu-item::before {
358
- background: linear-gradient(135deg,
380
+ background: linear-gradient(
381
+ 135deg,
359
382
  rgba(255, 255, 255, 0.08) 0%,
360
- rgba(255, 255, 255, 0.04) 100%);
383
+ rgba(255, 255, 255, 0.04) 100%
384
+ );
361
385
  box-shadow:
362
386
  0 2px 4px rgba(0, 0, 0, 0.12),
363
387
  inset 0 1px 0 rgba(255, 255, 255, 0.08);
364
388
  }
365
389
 
366
390
  .layout-container .n-menu-item:hover::before {
367
- background: linear-gradient(135deg,
391
+ background: linear-gradient(
392
+ 135deg,
368
393
  rgba(255, 255, 255, 0.12) 0%,
369
- rgba(255, 255, 255, 0.08) 100%);
394
+ rgba(255, 255, 255, 0.08) 100%
395
+ );
370
396
  }
371
397
  }
372
398
 
373
- .light-theme {
399
+ :where(.layout-container) .light-theme {
374
400
  color-scheme: light;
375
401
 
376
402
  .layout-container .n-menu-item::before {
377
- background: linear-gradient(135deg,
403
+ background: linear-gradient(
404
+ 135deg,
378
405
  rgba(255, 255, 255, 0.6) 0%,
379
- rgba(255, 255, 255, 0.4) 100%);
406
+ rgba(255, 255, 255, 0.4) 100%
407
+ );
380
408
  box-shadow:
381
409
  0 2px 4px rgba(0, 0, 0, 0.04),
382
410
  inset 0 1px 0 rgba(255, 255, 255, 0.8);
383
411
  }
384
412
 
385
413
  .layout-container .n-menu-item:hover::before {
386
- background: linear-gradient(135deg,
414
+ background: linear-gradient(
415
+ 135deg,
387
416
  rgba(255, 255, 255, 0.8) 0%,
388
- rgba(255, 255, 255, 0.6) 100%);
417
+ rgba(255, 255, 255, 0.6) 100%
418
+ );
389
419
  }
390
420
 
391
421
  .layout-container .n-menu-item-content::after {
@@ -433,29 +463,36 @@
433
463
 
434
464
  .layout-container
435
465
  .n-menu.n-menu--collapsed
436
- .n-menu-item-content--child-active
437
- .n-menu-item-content__icon
438
- {
466
+ .n-menu-item-content--child-active
467
+ .n-menu-item-content__icon {
439
468
  color: var(--n-item-color-active) !important;
440
469
  }
441
470
 
442
471
  /* 折叠菜单选中状态 - 使用二级选中效果变量 */
443
472
  .layout-container .n-menu.n-menu--collapsed .n-menu-item-content--child-active {
444
473
  background: transparent !important; /* 覆盖 Naive UI 默认背景 */
445
-
474
+
446
475
  &::before {
447
- background: linear-gradient(135deg,
476
+ background: linear-gradient(
477
+ 135deg,
448
478
  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;
479
+ var(--menu-selected-gradient-end, rgba(139, 92, 246, 0.16)) 100%
480
+ ) !important;
450
481
  border-radius: var(--menu-border-radius, 10px);
451
482
  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)),
483
+ var(
484
+ --menu-selected-shadow,
485
+ 0 2px 12px rgba(99, 102, 241, 0.22),
486
+ 0 4px 24px rgba(99, 102, 241, 0.15)
487
+ ),
453
488
  inset 0 1px 2px rgba(99, 102, 241, 0.12),
454
489
  inset 0 0 0 1px rgba(255, 255, 255, 0.08);
455
490
  }
456
491
 
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%));
492
+ backdrop-filter: blur(var(--menu-selected-blur, 16px))
493
+ saturate(var(--menu-selected-saturate, 135%));
494
+ -webkit-backdrop-filter: blur(var(--menu-selected-blur, 16px))
495
+ saturate(var(--menu-selected-saturate, 135%));
459
496
 
460
497
  &::after {
461
498
  border-radius: var(--menu-border-radius, 10px);
@@ -478,7 +515,7 @@
478
515
  }
479
516
 
480
517
  /* 折叠菜单图标颜色 */
481
- .n-menu--collapsed .n-menu-item-content__icon {
518
+ :where(.layout-container) .n-menu--collapsed .n-menu-item-content__icon {
482
519
  color: rgba(229, 231, 235, 0.9) !important;
483
520
  }
484
521
 
@@ -488,7 +525,7 @@
488
525
  min-width: 0;
489
526
  }
490
527
 
491
- .no-horizontal-scroll {
528
+ :where(.layout-container) .no-horizontal-scroll {
492
529
  overflow-x: hidden !important;
493
530
  }
494
531
 
@@ -557,16 +594,18 @@
557
594
  position: relative;
558
595
 
559
596
  &::after {
560
- content: '';
597
+ content: "";
561
598
  position: absolute;
562
599
  bottom: 0;
563
600
  left: 16px;
564
601
  right: 16px;
565
602
  height: 1px;
566
- background: linear-gradient(to right,
603
+ background: linear-gradient(
604
+ to right,
567
605
  transparent,
568
606
  rgba(99, 102, 241, 0.2),
569
- transparent);
607
+ transparent
608
+ );
570
609
  }
571
610
  }
572
611
 
@@ -574,10 +613,12 @@
574
613
  .layout-container .n-menu-divider {
575
614
  margin: 8px 16px;
576
615
  height: 1px;
577
- background: linear-gradient(to right,
616
+ background: linear-gradient(
617
+ to right,
578
618
  transparent,
579
619
  rgba(255, 255, 255, 0.1),
580
- transparent);
620
+ transparent
621
+ );
581
622
  backdrop-filter: blur(4px);
582
623
  -webkit-backdrop-filter: blur(4px);
583
624
  }
@@ -585,16 +626,18 @@
585
626
  /* 加载状态优化 */
586
627
  .layout-container .n-menu-item.n-menu-item--loading {
587
628
  &::before {
588
- background: linear-gradient(90deg,
629
+ background: linear-gradient(
630
+ 90deg,
589
631
  rgba(99, 102, 241, 0.1) 0%,
590
632
  rgba(139, 92, 246, 0.2) 50%,
591
- rgba(99, 102, 241, 0.1) 100%);
633
+ rgba(99, 102, 241, 0.1) 100%
634
+ );
592
635
  background-size: 200% 100%;
593
- animation: shimmer 2s infinite;
636
+ animation: ra-layout-shimmer 2s infinite;
594
637
  }
595
638
  }
596
639
 
597
- @keyframes shimmer {
640
+ @keyframes ra-layout-shimmer {
598
641
  0% {
599
642
  background-position: -200% 0;
600
643
  }
@@ -603,6 +646,18 @@
603
646
  }
604
647
  }
605
648
 
649
+ @keyframes ra-layout-pulse-glow {
650
+ 0%,
651
+ 100% {
652
+ opacity: 0.6;
653
+ transform: scale(1);
654
+ }
655
+ 50% {
656
+ opacity: 1;
657
+ transform: scale(1.1);
658
+ }
659
+ }
660
+
606
661
  /* 禁用状态 */
607
662
  .layout-container .n-menu-item.n-menu-item--disabled {
608
663
  opacity: 0.4;
@@ -621,56 +676,56 @@
621
676
  // ==================== ⚡ 页面切换过渡动画 ====================
622
677
 
623
678
  // 滑动效果
624
- .fade-slide-enter-active,
625
- .fade-slide-leave-active {
679
+ :where(.layout-container) .fade-slide-enter-active,
680
+ :where(.layout-container) .fade-slide-leave-active {
626
681
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
627
682
  }
628
683
 
629
- .fade-slide-enter-from {
684
+ :where(.layout-container) .fade-slide-enter-from {
630
685
  opacity: 0;
631
686
  transform: translateX(20px);
632
687
  }
633
688
 
634
- .fade-slide-leave-to {
689
+ :where(.layout-container) .fade-slide-leave-to {
635
690
  opacity: 0;
636
691
  transform: translateX(-20px);
637
692
  }
638
693
 
639
694
  // 淡入效果
640
- .fade-transform-enter-active,
641
- .fade-transform-leave-active {
695
+ :where(.layout-container) .fade-transform-enter-active,
696
+ :where(.layout-container) .fade-transform-leave-active {
642
697
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
643
698
  }
644
699
 
645
- .fade-transform-enter-from {
700
+ :where(.layout-container) .fade-transform-enter-from {
646
701
  opacity: 0;
647
702
  transform: scale(0.95);
648
703
  }
649
704
 
650
- .fade-transform-leave-to {
705
+ :where(.layout-container) .fade-transform-leave-to {
651
706
  opacity: 0;
652
707
  transform: scale(1.05);
653
708
  }
654
709
 
655
710
  // 缩放效果
656
- .fade-zoom-enter-active,
657
- .fade-zoom-leave-active {
711
+ :where(.layout-container) .fade-zoom-enter-active,
712
+ :where(.layout-container) .fade-zoom-leave-active {
658
713
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
659
714
  }
660
715
 
661
- .fade-zoom-enter-from {
716
+ :where(.layout-container) .fade-zoom-enter-from {
662
717
  opacity: 0;
663
718
  transform: scale(0.8);
664
719
  }
665
720
 
666
- .fade-zoom-leave-to {
721
+ :where(.layout-container) .fade-zoom-leave-to {
667
722
  opacity: 0;
668
723
  transform: scale(0.8);
669
724
  }
670
725
 
671
726
  // ==================== 🎨 布局开发中提示样式 ====================
672
727
 
673
- .layout-coming-soon {
728
+ :where(.layout-container) .layout-coming-soon {
674
729
  display: flex;
675
730
  align-items: center;
676
731
  justify-content: center;
@@ -678,7 +733,7 @@
678
733
  background-color: var(--app-bg-content);
679
734
  }
680
735
 
681
- .coming-soon-content {
736
+ :where(.layout-container) .coming-soon-content {
682
737
  text-align: center;
683
738
  max-width: 400px;
684
739
  padding: 40px;
@@ -687,19 +742,19 @@
687
742
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
688
743
  }
689
744
 
690
- .coming-soon-icon {
745
+ :where(.layout-container) .coming-soon-icon {
691
746
  font-size: 64px;
692
747
  margin-bottom: 16px;
693
748
  }
694
749
 
695
- .coming-soon-title {
750
+ :where(.layout-container) .coming-soon-title {
696
751
  font-size: 24px;
697
752
  font-weight: 600;
698
753
  margin-bottom: 8px;
699
754
  color: var(--app-text-primary);
700
755
  }
701
756
 
702
- .coming-soon-desc {
757
+ :where(.layout-container) .coming-soon-desc {
703
758
  font-size: 16px;
704
759
  color: var(--app-text-secondary);
705
760
  line-height: 1.5;