fix: wrap Outlet in SuspenseBoundary to prevent full-page flash on route change
This commit is contained in:
parent
593666135c
commit
c2f68b9c2d
19
input.css
19
input.css
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 {}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user