fix: wrap Outlet in SuspenseBoundary to prevent full-page flash on route change

This commit is contained in:
xfy 2026-06-04 11:03:56 +08:00
parent 593666135c
commit c2f68b9c2d
2 changed files with 29 additions and 3 deletions

View File

@ -556,6 +556,21 @@
} }
} }
@keyframes pageEnter {
from {
opacity: 0;
transform: translateY(4px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.page-enter {
animation: pageEnter 0.15s ease-out;
}
/* Reduced Motion */ /* Reduced Motion */
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
html { html {
@ -565,4 +580,8 @@
details::details-content { details::details-content {
transition: none; transition: none;
} }
.page-enter {
animation: none;
}
} }

View File

@ -3,19 +3,26 @@ use dioxus::prelude::*;
use crate::components::footer::Footer; use crate::components::footer::Footer;
use crate::components::header::Header; use crate::components::header::Header;
use crate::components::nav::use_nav_items; use crate::components::nav::use_nav_items;
use crate::components::skeletons::home_skeleton::HomeSkeleton;
use crate::components::skeletons::delayed_skeleton::DelayedSkeleton;
use crate::router::Route; use crate::router::Route;
use crate::theme::ThemeToggle; use crate::theme::ThemeToggle;
#[component] #[component]
pub fn FrontendLayout() -> Element { pub fn FrontendLayout() -> Element {
let route = use_route::<Route>(); let route = use_route::<Route>();
let nav_items = use_nav_items(route); let nav_items = use_nav_items(route.clone());
rsx! { rsx! {
div { class: "min-h-screen flex flex-col bg-white dark:bg-[#1d1e20] transition-colors duration-300", div { class: "min-h-screen flex flex-col bg-white dark:bg-[#1d1e20]",
Header { nav_items, right_content: rsx! { ThemeToggle {} } } Header { nav_items, right_content: rsx! { ThemeToggle {} } }
main { class: "flex-1 w-full max-w-3xl mx-auto px-6 py-6", main { class: "flex-1 w-full max-w-3xl mx-auto px-6 py-6",
Outlet::<Route> {} SuspenseBoundary {
fallback: |_| rsx! {
DelayedSkeleton { HomeSkeleton {} }
},
Outlet::<Route> {}
}
} }
Footer {} Footer {}
} }