From 62aaa8cb8583d9189358a6c15ca69257b342c4ea Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Thu, 15 May 2025 09:09:37 +0100 Subject: feat: dock hover and pinning focus --- assets/style.scss | 54 +++++++++++++++++++++--- src/lib.rs | 124 ++++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 159 insertions(+), 19 deletions(-) diff --git a/assets/style.scss b/assets/style.scss index b03393c..75b058f 100644 --- a/assets/style.scss +++ b/assets/style.scss @@ -147,7 +147,7 @@ p { border-width: 0 2px 0 0; border-color: black; border-style: solid; - height: auto; + height: 100%; width: 400px; flex: 0 0 auto; align-self: stretch; @@ -405,17 +405,16 @@ p { .sidebar { display: flex; + z-index: 1; } .dock { + z-index: 30; display: flex; flex-direction: column; border-width: 0 2px 0 0; } -.shortcuts { - padding: 8px 0; -} .dock-item { display: flex; @@ -451,11 +450,12 @@ p { opacity: 100%; } -.shortcuts { +.dock .shortcuts { + padding: 8px 0; border-bottom: 2px solid black; } -.dock-item img { +.dock .shortcuts .dock-item img { width: 64px; height: 64px; padding: 4px 8px; @@ -471,6 +471,48 @@ p { right: 0; } +.dock .pins { + flex: 1 1 auto; +} + +.dock .personal { + padding: 8px 0; + flex: 0 0 auto; + border-top: 2px solid black; +} + +.dock .personal .dock-item { + padding: 8px 16px +} + +.dock .personal .avatar-with-presence .avatar { + width: 48px; + height: 48px; +} + +.sidebar-drawer { + height: auto; + position: relative; + z-index: 5; +} + +.sidebar-hovering-drawer { + z-index: 10; +} + +.sidebar .sidebar-hovering-drawer>* { + position: absolute; + left: 0; + transition: left 0.2s ease-in; + transition-behaviour: allow-discrete; +} +@starting-style { + .sidebar .sidebar-hovering-drawer>* { + /* TODO: allow to edit this width */ + left: -400px; + } +} + /* font-families */ /* thai */ diff --git a/src/lib.rs b/src/lib.rs index 194a8d9..5961204 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -621,6 +621,15 @@ fn Macaw( let user_presences = Store::new(UserPresences::new()); provide_context(user_presences); + let client_user = LocalResource::new(move || { + async move { + let client = use_context::().expect("client not in context"); + let user = client.get_user((*client.jid).clone()).await.unwrap(); + MacawUser::got_user(user) + } + }); + provide_context(client_user); + // TODO: get cached contacts on login before getting the updated contacts OnceResource::new(async move { @@ -717,16 +726,22 @@ pub enum SidebarOpen { Chats, } -pub fn toggle_open(state: &mut Option, open: SidebarOpen) { +/// returns whether the state was changed to open (true) or closed (false) +pub fn toggle_open(state: &mut Option, open: SidebarOpen) -> bool { match state { Some(opened) => { if *opened == open { - *state = None + *state = None; + false } else { - *state = Some(open) + *state = Some(open); + true } } - None => *state = Some(open), + None => { + *state = Some(open); + true + }, } } @@ -736,19 +751,41 @@ pub fn Sidebar() -> impl IntoView { let (open, set_open) = signal(None::); // for what is just in the hovered state (not clicked to be pinned open yet necessarily) let (hovered, set_hovered) = signal(None::); + let (just_closed, set_just_closed) = signal(false); view! { -