zero_ui/lib/
sidebar.rs

1use leptos::*;
2
3pub struct SidebarTabs<const TLENGTH: usize = 0, const BLENGTH: usize = 0> {
4    pub top: Option<[(View, View); TLENGTH]>,
5    pub bottom: Option<[(View, View); BLENGTH]>,
6}
7
8// impl Into for SidebarTabs<T> {}
9
10#[component]
11pub fn Sidebar<T, TIV, B, BIV, M, MIV /*, const TLENGTH: usize, const BLENGTH: usize*/>(
12    #[prop(into, optional)] id: Option<String>,
13    #[prop(into, optional)] class: Option<String>,
14    #[prop(into, optional)] style: Option<String>,
15    /*
16    #[prop(into, optional, into, default=Some(SidebarTabs{top: None, bottom: None}))] tabs: Option<
17        SidebarTabs<TLENGTH, BLENGTH>,
18    >,
19    */
20    top_icons: T,
21    bottom_icons: B,
22    menu: M,
23) -> impl IntoView
24where
25    T: Fn() -> TIV,
26    TIV: IntoView,
27    B: Fn() -> BIV,
28    BIV: IntoView,
29    M: Fn() -> MIV,
30    MIV: IntoView,
31{
32    view! {
33        <div
34            id=id.unwrap_or("Sidebar".to_string())
35            class=class.unwrap_or("flex flex-row zero-divide-x w-64".to_string())
36            style=style
37        >
38            <div id="SidebarIcons" class="flex flex-col min-h-screen overflow-y-auto">
39                {top_icons()}
40                <div class="grow"></div>
41                {bottom_icons()}
42            </div>
43            <div id="SidebarMenu" class="flex flex-1 flex-col min-h-screen overflow-y-auto">
44                {menu()}
45            </div>
46
47        </div>
48    }
49}
50