leptos_struct_table/
scroll_container.rs1use 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}