From 089005c8d2f94d5ca42366fdd82cb4429fcc2dfa Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Tue, 10 Jun 2025 22:58:26 +0100 Subject: fix: hold drawer state across pinning --- assets/style.scss | 28 ++++++++++--------- src/components/sidebar.rs | 68 ++++++++++++++++++++++++++--------------------- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/assets/style.scss b/assets/style.scss index 4078aa1..6903145 100644 --- a/assets/style.scss +++ b/assets/style.scss @@ -284,7 +284,7 @@ background: #00000060; .chats-list-chats, .roster-list-roster { flex-grow: 1; - overflow: scroll; + overflow-y: scroll; } .open-chat-views { @@ -345,7 +345,7 @@ background: #00000060; color: black; background-color: #dcdcdc; max-height: 32em; - overflow: scroll; + overflow-y: scroll; font-size: 16px; border: 2px solid black; padding: 8px; @@ -372,7 +372,7 @@ background: #00000060; /* You could leave this, but after a user resizes, then it ruins the auto sizing */ resize: none; /* Firefox shows scrollbar on growth, you can hide like this. */ - overflow: scroll; + overflow-y: scroll; } .grow-wrap>textarea, @@ -395,7 +395,7 @@ background: #00000060; display: flex; flex-direction: column-reverse; flex-grow: 1; - overflow: scroll; + overflow-y: scroll; } .chat-message { @@ -573,6 +573,10 @@ background: #00000060; border-top: 2px solid black; } +.sidebar { + position: relative; +} + .dock .personal .dock-item { padding: 8px 16px } @@ -584,7 +588,6 @@ background: #00000060; .sidebar-drawer { height: auto; - position: relative; z-index: 5; } @@ -592,17 +595,18 @@ background: #00000060; z-index: 10; } -.sidebar .sidebar-hovering-drawer>* { +.sidebar .sidebar-hovering-drawer { position: absolute; - left: 0; - transition: left 0.2s ease-in; - transition-behaviour: allow-discrete; + height: 100%; + /* must be width of dock... */ + left: 82px; + transition: left 0.2s ease-out allow-discrete; } @starting-style { - .sidebar .sidebar-hovering-drawer>* { + .sidebar .sidebar-hovering-drawer { /* TODO: allow to edit this width */ - left: -400px; + left: -318px; } } @@ -1443,4 +1447,4 @@ hr { font-weight: normal; font-style: italic; font-display: block; -} \ No newline at end of file +} diff --git a/src/components/sidebar.rs b/src/components/sidebar.rs index ca753ef..487fb76 100644 --- a/src/components/sidebar.rs +++ b/src/components/sidebar.rs @@ -1,7 +1,8 @@ -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use jid::BareJID; use leptos::prelude::*; +use reactive_stores::Store; use crate::components::{ personal_status::PersonalStatus, @@ -9,12 +10,18 @@ use crate::components::{ roster_list::RosterList, }; -#[derive(PartialEq, Eq, Clone, Copy)] +#[derive(PartialEq, Eq, Clone, Copy, Hash)] pub enum SidebarOpen { Roster, Chats, } +#[derive(Store)] +pub struct Drawer { + open: SidebarOpen, + hovering: bool, +} + pub enum Open { /// Currently on screen Focused, @@ -68,8 +75,22 @@ pub fn Sidebar() -> impl IntoView { // for what has been clicked open (in the background) let (open, set_open) = signal(None::); // for what is just in the hovered state (not clicked to be pinned open yet necessarily) + let open= Memo::new(move |_| open.get()); let (hovered, set_hovered) = signal(None::); + let hovered = Memo::new(move |_| hovered.get()); let (just_closed, set_just_closed) = signal(false); + let just_closed = Memo::new(move |_| just_closed.get()); + + let pages = Memo::new(move |_| { + let mut pages = HashSet::new(); + if let Some(hovered) = *hovered.read() { + pages.insert(hovered); + } + if let Some(opened) = *open.read() { + pages.insert(opened); + } + pages + }); view! { - {move || if let Some(hovered) = *hovered.read() { - if Some(hovered) != *open.read() { - if !just_closed.get() { - match hovered { + {move || { + if !just_closed.get() { + view! { + + {move || match page { SidebarOpen::Roster => view! { -