diff --git a/frontend/src/components/layout/statusbar.rs b/frontend/src/components/layout/statusbar.rs index 7f2c7c1..41323ce 100644 --- a/frontend/src/components/layout/statusbar.rs +++ b/frontend/src/components/layout/statusbar.rs @@ -1,6 +1,5 @@ use leptos::*; use shared::GlobalLimitRequest; -use wasm_bindgen::JsCast; fn format_bytes(bytes: i64) -> String { const UNITS: [&str; 6] = ["B", "KB", "MB", "GB", "TB", "PB"]; @@ -110,64 +109,41 @@ pub fn StatusBar() -> impl IntoView { }); }; - // Helper to close all details dropdowns - let close_dropdown = move || { - if let Some(doc) = web_sys::window().and_then(|w| w.document()) { - // Close all
elements in the status bar - let details_list = doc.query_selector_all("details.dropdown[open]"); - if let Ok(nodes) = details_list { - for i in 0..nodes.length() { - if let Some(node) = nodes.item(i) { - if let Ok(el) = node.dyn_into::() { - el.remove_attribute("open").ok(); - } - } - } - } - // Also blur active element as fallback - if let Some(active) = doc.active_element() { - let _ = active - .dyn_into::() - .map(|el| el.blur()); - } + // Signal-based dropdown state: 0=none, 1=download, 2=upload, 3=theme + let (active_dropdown, set_active_dropdown) = create_signal(0u8); + + // Toggle a specific dropdown + let toggle = move |id: u8| { + if active_dropdown.get_untracked() == id { + set_active_dropdown.set(0); + } else { + set_active_dropdown.set(id); } }; - // Toggle dropdown: close all, the
native toggle handles opening - let toggle_dropdown = move |_id: u8| { - // No-op:
handles its own open/close natively - // We just need this for the close_dropdown helper + // Close all dropdowns + let close_all = move || { + set_active_dropdown.set(0); }; - // Global listener to close dropdowns on touchstart outside - let force_blur = move |_| { - if let Some(doc) = web_sys::window().and_then(|w| w.document()) { - let details_list = doc.query_selector_all("details.dropdown[open]"); - if let Ok(nodes) = details_list { - for i in 0..nodes.length() { - if let Some(node) = nodes.item(i) { - if let Ok(el) = node.dyn_into::() { - el.remove_attribute("open").ok(); - } - } - } - } - } - }; - let _ = window_event_listener(ev::touchstart, force_blur); + // Close dropdowns when tapping outside + let _ = window_event_listener(ev::pointerdown, move |_| { + // This fires first; dropdown buttons call stop_propagation to prevent closing + set_active_dropdown.set(0); + }); view! {
// --- DOWNLOAD SPEED DROPDOWN --- -
-
+ // --- UPLOAD SPEED DROPDOWN --- - +
-
-
+