leptos_struct_table/
scroll_container.rs

1use leptos::html::ElementDescriptor;
2use leptos::{NodeRef, Signal};
3use leptos_use::core::ElementMaybeSignal;
4use leptos_use::use_document;
5use wasm_bindgen::JsCast;
6
7#[derive(Copy, Clone, Debug)]
8pub struct ScrollContainer(Signal<Option<web_sys::Element>>);
9
10impl Default for ScrollContainer {
11    fn default() -> Self {
12        Self(Signal::derive(move || {
13            use_document()
14                .body()
15                .as_ref()
16                .map(|w| w.unchecked_ref::<web_sys::Element>().clone())
17        }))
18    }
19}
20
21impl From<web_sys::Element> for ScrollContainer {
22    fn from(element: web_sys::Element) -> Self {
23        Self(Signal::derive(move || Some(element.clone())))
24    }
25}
26
27impl From<Option<web_sys::Element>> for ScrollContainer {
28    fn from(element: Option<web_sys::Element>) -> Self {
29        Self(Signal::derive(move || element.clone()))
30    }
31}
32
33impl<T> From<NodeRef<T>> for ScrollContainer
34where
35    T: ElementDescriptor + Clone + 'static,
36{
37    fn from(node_ref: NodeRef<T>) -> Self {
38        Self(Signal::derive(move || {
39            node_ref.get().map(|el| {
40                let el: &web_sys::Element = &el.into_any();
41                el.clone()
42            })
43        }))
44    }
45}
46
47impl From<&str> for ScrollContainer {
48    fn from(selector: &str) -> Self {
49        let selector = selector.to_owned();
50
51        Self(Signal::derive(move || {
52            use_document().query_selector(&selector).unwrap_or_default()
53        }))
54    }
55}
56
57impl From<ScrollContainer> for ElementMaybeSignal<web_sys::Element, web_sys::Element> {
58    fn from(scroll_container: ScrollContainer) -> Self {
59        scroll_container.0.into()
60    }
61}