pub struct Overlay { /* private fields */ }Expand description
A portal layer: its content is laid out out-of-flow, filling the viewport, and hoisted to the top at
compose time — drawn above everything and free of any ancestor clip/transform. A base primitive:
unstyled; wrap content in a box for a scrim/panel, and position it with normal flex (align/justify).
The content is a separate layout node attached to the layout root (the overlay host), not to the
widget’s DOM parent — so a portal declared deep in the tree (e.g. inside a reactive if) still covers
the whole window instead of collapsing to its parent’s box. The widget hands its DOM parent only a
zero-size placeholder, so it never affects sibling layout. If no host has been laid out yet (a portal
present at the very first frame), it falls back to laying the content out in place.
Positioned pointer events reach the content with priority via a thread-local overlay registry (see
ui_tree::overlay_dispatch): a click on the overlay is routed here before the main tree walk and does
not fall through to the content behind it, so a scrim that fills the viewport reads as a modal.
Variants (all portal the same way, they differ in how they route clicks and where the content sits):
Overlay::new— modal: blocks every click inside its content rect (a full-viewport scrim).Overlay::new_click_through— non-modal: clicks on the transparent fill fall through to the tree; only clicks a child handles are consumed. For a toast/tooltip layer that must not eat background clicks.Overlay::anchored— positions the content next to a trigger widget (dropdowns/menus/tooltips): the content is translated to the trigger’s rect and only that panel blocks, so clicks elsewhere fall through.
Implementations§
Source§impl Overlay
impl Overlay
Sourcepub fn new(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
) -> Result<Self, LayoutError>
pub fn new( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, ) -> Result<Self, LayoutError>
A modal portal: the content fills the viewport and blocks every click behind it.
Sourcepub fn toggleable(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
visible: impl Fn() -> bool + 'static,
) -> Result<Self, LayoutError>
pub fn toggleable( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, visible: impl Fn() -> bool + 'static, ) -> Result<Self, LayoutError>
A modal portal that is kept mounted and shown/hidden by visible (read each frame). Unlike disposing
and rebuilding the overlay on every open, this preserves its content across close/reopen — needed for a
dialog whose body arrives as a pre-built slot (which cannot be rebuilt once consumed). Hidden, it draws
nothing and blocks nothing.
Sourcepub fn new_click_through(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
) -> Result<Self, LayoutError>
pub fn new_click_through( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, ) -> Result<Self, LayoutError>
A non-modal portal: clicks on the transparent fill fall through to the content behind; only clicks a child actually handles are consumed. Use for a toast/tooltip layer that must not block the page.
Sourcepub fn anchored(
layout_style: LayoutStyle,
children: Vec<Box<dyn LayoutItem>>,
trigger: RwSignal<Rect>,
placement: Placement,
) -> Result<Self, LayoutError>
pub fn anchored( layout_style: LayoutStyle, children: Vec<Box<dyn LayoutItem>>, trigger: RwSignal<Rect>, placement: Placement, ) -> Result<Self, LayoutError>
A portal whose content is positioned next to trigger (a dropdown/menu/tooltip popping up by its
button). The content sizes to its intrinsic panel and is translated to the trigger’s rect per
placement; only that panel blocks (the barrier tracks the trigger), so clicks elsewhere fall through.