laobinghu e73f62133b feat: enhance transitions and animations with UnoCSS
- Add advanced page/layout transitions (slide, zoom, fade with blur)
- Enhance UnoCSS config with keyframes, transitions, and shortcuts
- Add staggered animations for stat cards and table rows
- Improve sidebar menu animations with slide-in effects
- Add custom dialog/drawer transitions with bounce effects
- Optimize transition timing with cubic-bezier easing

Based on Element Plus transitions guide and Nuxt 4 transitions docs
2026-03-22 08:30:49 +08:00

118 lines
2.1 KiB
Vue

<template>
<NuxtLoadingIndicator />
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>
<style>
/* Page Transitions - Enhanced with multiple effects */
.page-enter-active,
.page-leave-active {
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: absolute;
width: 100%;
}
.page-enter-from {
opacity: 0;
transform: translateY(20px) scale(0.98);
filter: blur(2px);
}
.page-leave-to {
opacity: 0;
transform: translateY(-20px) scale(1.02);
filter: blur(2px);
}
/* Slide transitions for dynamic direction */
.page-slide-left-enter-from {
opacity: 0;
transform: translateX(50px);
}
.page-slide-left-leave-to {
opacity: 0;
transform: translateX(-50px);
}
.page-slide-right-enter-from {
opacity: 0;
transform: translateX(-50px);
}
.page-slide-right-leave-to {
opacity: 0;
transform: translateX(50px);
}
/* Zoom transitions */
.page-zoom-enter-from {
opacity: 0;
transform: scale(0.9);
}
.page-zoom-leave-to {
opacity: 0;
transform: scale(1.1);
}
/* Layout Transitions - Enhanced */
.layout-enter-active,
.layout-leave-active {
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: absolute;
width: 100%;
}
.layout-enter-from {
opacity: 0;
filter: grayscale(100%) brightness(0.8);
transform: scale(0.95);
}
.layout-leave-to {
opacity: 0;
filter: grayscale(100%) brightness(1.2);
transform: scale(1.05);
}
/* Collapse transition for sidebar */
.sidebar-collapse-enter-active,
.sidebar-collapse-leave-active {
transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Custom dialog/drawer transitions */
.dialog-zoom :deep(.el-dialog) {
animation: custom-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.drawer-transition :deep(.el-drawer) {
animation: custom-slide-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes custom-zoom {
0% {
opacity: 0;
transform: scale(0.8) translateY(-20px);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
}
}
@keyframes custom-slide-in {
0% {
opacity: 0;
transform: translateX(-100%);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
</style>