2023-07-03 16:10:58 +01:00
|
|
|
use leptos::html::Div;
|
2023-05-27 15:12:05 +01:00
|
|
|
use leptos::*;
|
2023-05-28 17:42:16 +01:00
|
|
|
use leptos_use::docs::{demo_or_body, BooleanDisplay};
|
|
|
|
use leptos_use::{use_scroll_with_options, ScrollBehavior, UseScrollOptions, UseScrollReturn};
|
2023-05-27 15:12:05 +01:00
|
|
|
|
2023-07-13 08:04:01 +02:00
|
|
|
use web_sys::Event;
|
|
|
|
|
2023-05-27 15:12:05 +01:00
|
|
|
#[component]
|
|
|
|
fn Demo(cx: Scope) -> impl IntoView {
|
2023-07-03 16:10:58 +01:00
|
|
|
let el = create_node_ref::<Div>(cx);
|
2023-05-28 17:42:16 +01:00
|
|
|
let (smooth, set_smooth) = create_signal(cx, false);
|
|
|
|
let behavior = Signal::derive(cx, move || {
|
2023-06-21 13:09:00 +02:00
|
|
|
if smooth.get() {
|
2023-05-28 17:42:16 +01:00
|
|
|
ScrollBehavior::Smooth
|
|
|
|
} else {
|
|
|
|
ScrollBehavior::Auto
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
let UseScrollReturn {
|
|
|
|
x,
|
|
|
|
y,
|
|
|
|
set_x,
|
|
|
|
set_y,
|
|
|
|
is_scrolling,
|
|
|
|
arrived_state,
|
|
|
|
directions,
|
|
|
|
..
|
2023-07-13 08:04:01 +02:00
|
|
|
} = use_scroll_with_options(
|
|
|
|
cx,
|
|
|
|
el,
|
|
|
|
UseScrollOptions::default()
|
|
|
|
.behavior(behavior)
|
|
|
|
.on_stop(move |_: Event| {
|
|
|
|
log!("scrolling stopped");
|
|
|
|
})
|
|
|
|
.on_scroll(move |_: Event| {
|
|
|
|
log!("scrolling");
|
|
|
|
}),
|
|
|
|
);
|
2023-05-28 17:42:16 +01:00
|
|
|
|
2023-05-27 15:12:05 +01:00
|
|
|
view! { cx,
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="flex">
|
2023-05-28 17:52:13 +01:00
|
|
|
<div node_ref=el class="w-[300px] h-[300px] m-auto my-auto overflow-scroll bg-gray-500/5 rounded">
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="w-[500px] h-[400px] relative">
|
|
|
|
<div class="absolute left-0 top-0 bg-gray-500/5 px-2 py-1">
|
|
|
|
"top_left"
|
|
|
|
</div>
|
|
|
|
<div class="absolute left-0 bottom-0 bg-gray-500/5 px-2 py-1">
|
|
|
|
"bottom_left"
|
|
|
|
</div>
|
|
|
|
<div class="absolute right-0 top-0 bg-gray-500/5 px-2 py-1">
|
|
|
|
"top_right"
|
|
|
|
</div>
|
|
|
|
<div class="absolute right-0 bottom-0 bg-gray-500/5 px-2 py-1">
|
|
|
|
"bottom_right"
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="absolute left-1/3 top-1/3 bg-gray-500/5 px-2 py-1">
|
|
|
|
"Scroll Me"
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2023-05-27 15:12:05 +01:00
|
|
|
|
2023-05-28 17:52:13 +01:00
|
|
|
<div class="my-10 w-280px pl-4">
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="px-6 py-4 rounded grid grid-cols-[120px_auto] gap-4 bg-gray-500/5">
|
|
|
|
<span class="text-right opacity-75 py-4">
|
|
|
|
"X Position"
|
|
|
|
</span>
|
|
|
|
<div class="text-primary">
|
|
|
|
<div>
|
|
|
|
<input
|
2023-06-21 13:09:00 +02:00
|
|
|
prop:value=move || format!("{:.1}", x.get())
|
2023-05-28 17:42:16 +01:00
|
|
|
on:input=move |e| {
|
|
|
|
if let Ok(num) = event_target_value(&e).parse::<f64>() {
|
|
|
|
set_x(num);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
type="number"
|
|
|
|
min="0"
|
|
|
|
max="200"
|
|
|
|
step="10"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<span class="text-right opacity-75 py-4">
|
|
|
|
"Y Position"
|
|
|
|
</span>
|
|
|
|
<div class="text-primary">
|
|
|
|
<div>
|
|
|
|
<input
|
2023-06-21 13:09:00 +02:00
|
|
|
prop:value=move || format!("{:.1}", y.get())
|
2023-05-28 17:42:16 +01:00
|
|
|
on:input=move |e| {
|
|
|
|
if let Ok(num) = event_target_value(&e).parse::<f64>() {
|
|
|
|
set_y(num);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
type="number"
|
|
|
|
min="0"
|
|
|
|
max="200"
|
|
|
|
step="10"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<label for_="smooth-scrolling-option" class="text-right opacity-75">
|
|
|
|
"Smooth scrolling"
|
|
|
|
</label>
|
|
|
|
<span>
|
|
|
|
<input
|
|
|
|
id="smooth-scrolling-option"
|
2023-06-21 13:09:00 +02:00
|
|
|
prop:checked=move || smooth.get()
|
|
|
|
on:input=move |e| set_smooth.set(event_target_checked(&e))
|
2023-05-28 17:42:16 +01:00
|
|
|
type="checkbox"
|
|
|
|
/>
|
|
|
|
</span>
|
|
|
|
<span class="text-right opacity-75">
|
|
|
|
"Is Scrolling"
|
|
|
|
</span>
|
|
|
|
<BooleanDisplay value=is_scrolling />
|
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Top Arrived"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || arrived_state.get().top) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Right Arrived"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || arrived_state.get().right) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Bottom Arrived"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || arrived_state.get().bottom) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Left Arrived"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || arrived_state.get().left) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Scrolling Up"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || directions.get().top) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Scrolling Right"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || directions.get().right) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Scrolling Down"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || directions.get().bottom) />
|
2023-05-28 17:42:16 +01:00
|
|
|
<div class="text-right opacity-75">
|
|
|
|
"Scrolling Left"
|
|
|
|
</div>
|
2023-06-21 13:09:00 +02:00
|
|
|
<BooleanDisplay value=Signal::derive(cx, move || directions.get().left) />
|
2023-05-28 17:42:16 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2023-05-27 15:12:05 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
_ = console_log::init_with_level(log::Level::Debug);
|
|
|
|
console_error_panic_hook::set_once();
|
|
|
|
|
|
|
|
mount_to(demo_or_body(), |cx| {
|
|
|
|
view! { cx, <Demo /> }
|
|
|
|
})
|
|
|
|
}
|