Skip to main content

Layout

Trait Layout 

Source
pub trait Layout {
    // Required method
    fn render(&self, content: Node) -> Node;

    // Provided method
    fn render_many(&self, contents: Vec<Node>) -> Node { ... }
}
Expand description

Wraps content in a consistent structure: a header, a footer, navigation.

§A footgun that does not exist here

Winged-Swift’s docs spend considerable space warning that HTMLTag is a reference type, so reusing one instance in two places silently shares the node — which is why its documented component pattern is “a function that returns a fresh tag each call”. In Rust Node is a value type, so reuse copies. Write components however you like.

§Examples

use winged_rust::prelude::*;
use winged_rust::Layout;

struct Blog { site_title: String }

impl Layout for Blog {
    fn render(&self, content: Node) -> Node {
        body()
            .child(header().child(h1().text(&self.site_title)))
            .child(main_tag().child(content))
            .child(footer().child(p().text("© 2026")))
            .into()
    }
}

let page = Blog { site_title: "RideKeeper".into() }.render(p().text("Hello").into());
assert!(page.render().contains("<h1>RideKeeper</h1>"));

Required Methods§

Source

fn render(&self, content: Node) -> Node

Wraps a single node in the layout.

Provided Methods§

Source

fn render_many(&self, contents: Vec<Node>) -> Node

Wraps several nodes, grouping them in a <div> first.

Matches the Swift extension, which also introduces a Div. Use Node::fragment and Layout::render if you would rather not have the wrapper.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§