Skip to content

Commit ef5c2e9

Browse files
feat: support visual viewport
1 parent 99243a7 commit ef5c2e9

5 files changed

Lines changed: 21 additions & 13 deletions

File tree

packages/dom/src/auto_update.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ pub fn auto_update(
299299
let event_target: &EventTarget = match ancestor {
300300
OverflowAncestor::Element(element) => element,
301301
OverflowAncestor::Window(window) => window,
302+
OverflowAncestor::VisualViewport(visual_viewport) => visual_viewport,
302303
};
303304

304305
if ancestor_scoll {
@@ -457,6 +458,7 @@ pub fn auto_update(
457458
let event_target: &EventTarget = match ancestor {
458459
OverflowAncestor::Element(element) => element,
459460
OverflowAncestor::Window(window) => window,
461+
OverflowAncestor::VisualViewport(visual_viewport) => visual_viewport,
460462
};
461463

462464
if ancestor_scoll {

packages/dom/src/platform/get_clipping_rect.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ fn get_clipping_element_ancestors(element: &Element) -> Vec<Element> {
9696
(get_node_name((&element).into()) != "body").then_some(element)
9797
}
9898
OverflowAncestor::Window(_) => None,
99+
OverflowAncestor::VisualViewport(_) => None,
99100
})
100101
.collect();
101102
let mut current_containing_block_computed_style: Option<CssStyleDeclaration> = None;

packages/leptos/tests/visual/src/utils/use_scroll.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ pub fn use_scroll(
108108
let event_target: &EventTarget = match parent {
109109
OverflowAncestor::Element(element) => element,
110110
OverflowAncestor::Window(window) => window,
111+
OverflowAncestor::VisualViewport(visual_viewport) => visual_viewport,
111112
};
112113

113114
event_target
@@ -142,11 +143,10 @@ pub fn use_scroll(
142143

143144
let cleanup = SendWrapper::new(move || {
144145
for ancestor in ancestors.get().iter() {
145-
let event_target = match ancestor {
146-
OverflowAncestor::Element(element) => {
147-
element.unchecked_ref::<web_sys::EventTarget>()
148-
}
149-
OverflowAncestor::Window(window) => window.unchecked_ref::<web_sys::EventTarget>(),
146+
let event_target: &EventTarget = match ancestor {
147+
OverflowAncestor::Element(element) => element,
148+
OverflowAncestor::Window(window) => window,
149+
OverflowAncestor::VisualViewport(visual_viewport) => visual_viewport,
150150
};
151151

152152
event_target

packages/utils/src/dom.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
//! Utility functions for the DOM. Requires `dom` feature.
22
33
use web_sys::{
4-
CssStyleDeclaration, Document, Element, HtmlElement, Node, ShadowRoot, Window, css,
4+
CssStyleDeclaration, Document, Element, HtmlElement, Node, ShadowRoot, VisualViewport, Window,
5+
css,
56
js_sys::Object,
67
wasm_bindgen::{JsCast, JsValue},
78
window,
@@ -357,8 +358,7 @@ pub fn get_nearest_overflow_ancestor(node: &Node) -> HtmlElement {
357358
pub enum OverflowAncestor {
358359
Element(Element),
359360
Window(Window),
360-
// TODO
361-
// VisualViewport(VisualViewport)
361+
VisualViewport(VisualViewport),
362362
}
363363

364364
pub fn get_overflow_ancestors(
@@ -376,8 +376,11 @@ pub fn get_overflow_ancestors(
376376
if is_body {
377377
let frame_element = get_frame_element(&window);
378378

379-
list.push(OverflowAncestor::Window(window));
380-
// TODO: visual viewport
379+
list.push(OverflowAncestor::Window(window.clone()));
380+
381+
if let Some(visual_viewport) = window.visual_viewport() {
382+
list.push(OverflowAncestor::VisualViewport(visual_viewport));
383+
}
381384

382385
if is_overflow_element(&scrollable_ancestor) {
383386
list.push(OverflowAncestor::Element(scrollable_ancestor.into()));

packages/yew/tests/visual/src/utils/use_scroll.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ pub fn use_scroll(options: UseScrollOptions) -> UseScrollReturn {
115115
let event_target: &EventTarget = match parent {
116116
OverflowAncestor::Element(element) => element,
117117
OverflowAncestor::Window(window) => window,
118+
OverflowAncestor::VisualViewport(visual_viewport) => visual_viewport,
118119
};
119120

120121
event_target
@@ -165,9 +166,10 @@ pub fn use_scroll(options: UseScrollOptions) -> UseScrollReturn {
165166

166167
move || {
167168
for parent in parents {
168-
let event_target: EventTarget = match parent {
169-
OverflowAncestor::Element(element) => element.into(),
170-
OverflowAncestor::Window(window) => window.into(),
169+
let event_target: &EventTarget = match &parent {
170+
OverflowAncestor::Element(element) => element,
171+
OverflowAncestor::Window(window) => window,
172+
OverflowAncestor::VisualViewport(visual_viewport) => visual_viewport,
171173
};
172174

173175
event_target

0 commit comments

Comments
 (0)