Sidebar mobile improvement
The sidebar vanished on a too small display. Button to reopen and close are rendered
This commit is contained in:
@@ -84,9 +84,46 @@ pub struct SidebarShellProps {
|
||||
/// ```
|
||||
#[component(SidebarShell)]
|
||||
fn sidebar_shell(props: &SidebarShellProps) -> Html {
|
||||
let route = use_route::<Route>();
|
||||
let mobile_sidebar_open = use_state(|| false);
|
||||
|
||||
// Close mobile sidebar automatically on any route transition
|
||||
{
|
||||
let mobile_sidebar_open = mobile_sidebar_open.clone();
|
||||
use_effect_with(route, move |_| {
|
||||
mobile_sidebar_open.set(false);
|
||||
|| ()
|
||||
});
|
||||
}
|
||||
|
||||
let on_open = {
|
||||
let mobile_sidebar_open = mobile_sidebar_open.clone();
|
||||
Callback::from(move |_: MouseEvent| mobile_sidebar_open.set(true))
|
||||
};
|
||||
|
||||
let on_close = {
|
||||
let mobile_sidebar_open = mobile_sidebar_open.clone();
|
||||
Callback::from(move |_: ()| mobile_sidebar_open.set(false))
|
||||
};
|
||||
|
||||
let on_close_click = {
|
||||
let on_close = on_close.clone();
|
||||
Callback::from(move |_: MouseEvent| on_close.emit(()))
|
||||
};
|
||||
|
||||
html! {
|
||||
<div class="layout">
|
||||
<sidebar::Sidebar/>
|
||||
<button class="mobile-menu-toggle" onclick={on_open}>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="4" x2="20" y1="12" y2="12"/>
|
||||
<line x1="4" x2="20" y1="6" y2="6"/>
|
||||
<line x1="4" x2="20" y1="18" y2="18"/>
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<div class={if *mobile_sidebar_open { "sidebar-overlay open" } else { "sidebar-overlay" }} onclick={on_close_click}></div>
|
||||
|
||||
<sidebar::Sidebar is_open={*mobile_sidebar_open} on_close={on_close} />
|
||||
<main class="content">
|
||||
{ for props.children.iter() }
|
||||
</main>
|
||||
|
||||
Reference in New Issue
Block a user