Skip to main content

Layout

Trait Layout 

Source
pub trait Layout: ThemeExt {
    // Provided methods
    fn disclosure(&self, expanded: bool) -> Svg { ... }
    fn collapsible_header(
        &self,
        label: impl Into<SharedString>,
        expanded: bool,
    ) -> Div { ... }
    fn nav_row(
        &self,
        icon: Option<Icon>,
        label: impl Into<SharedString>,
        selected: bool,
        fade: Fade,
    ) -> Div { ... }
    fn toolbar_separator(&self) -> Div { ... }
    fn split_handle(&self, axis: Axis, style: SplitStyle) -> Div { ... }
    fn grip_handle(&self) -> Div { ... }
    fn tab_bar(&self) -> Div { ... }
    fn tab(&self, label: impl Into<SharedString>, active: bool) -> Div { ... }
}

Provided Methods§

Source

fn disclosure(&self, expanded: bool) -> Svg

The disclosure chevron: right when collapsed, down when expanded.

Two assets rather than one rotated: gpui has no transform for divs at the pinned rev, and an SVG rotation would need a transform on the element.

Source

fn collapsible_header( &self, label: impl Into<SharedString>, expanded: bool, ) -> Div

Header row of a collapsible section: chevron plus title. The caller owns expanded and renders the body itself — a container that swallowed its children would have to re-implement layout for them. Hover is caller-owned (gpui panics on a second hover); the default wash is Theme::element_hover.

Source

fn nav_row( &self, icon: Option<Icon>, label: impl Into<SharedString>, selected: bool, fade: Fade, ) -> Div

A navigation row: leading icon, truncating label, and whatever the caller appends — a count, a chevron, a control that shows on hover. shadcn calls it SidebarMenuButton, MUI ListItemButton.

The label is a parameter rather than a child because it carries the truncation, and a caller that has to remember min_w_0().flex_1() forgets it on the first long project name — which pushes the trailing content off the row instead of shortening the label.

fade must be stable across frames. It is also how a trailing control reveals itself on row hover: paint it with motion::hover_blend on this same fade, rather than adding an on_hover of its own — gpui allows only one per element, and this row has claimed it.

Source

fn toolbar_separator(&self) -> Div

A vertical rule between clusters of controls in a bar.

Source

fn split_handle(&self, axis: Axis, style: SplitStyle) -> Div

The divider between two panes: a hairline centred in a grab strip, lit while dragged.

The gesture stays with the caller, which owns the fraction — the handle is dragged with gpui’s null-preview drag, and the container reads the pointer:

ⓘ
div()
    .id("split")
    .on_drag_move(cx.listener(|view, event: &DragMoveEvent<SplitDrag>, _, cx| {
        view.fraction = axis_fraction(event.event.position, event.bounds, Axis::Horizontal, 0.15);
        cx.notify();
    }))
    .child(div().w(relative(self.fraction)).child(left))
    .child(
        theme.split_handle(Axis::Horizontal, SplitStyle::Line { dragging: self.dragging })
            .id("split-handle")
            .on_drag(SplitDrag, |_, _, _, cx| cx.new(|_| gpui::Empty)),
    )
    .child(div().flex_1().child(right))
Source

fn grip_handle(&self) -> Div

The grip along an edge that a box is dragged taller or shorter by: a Self::split_handle’s strip across the edge, holding a short bar in its middle that says the edge can be pulled.

Source

fn tab_bar(&self) -> Div

Tab strip: a hairline-underlined row that tabs sit on.

Switches between sections of one page, over a set fixed at compile time. Tabs that open and close are crate::tabs. It holds the tabs only; the panel a tab shows is the caller’s.

Keys are the caller’s, through crate::focus: focusable puts each tab in the tab order and gives it enter/space, and Decrement / Increment arrive on ← / → for whichever tab holds focus. Move focus with the selection, or the next arrow starts from the tab focus left.

Source

fn tab(&self, label: impl Into<SharedString>, active: bool) -> Div

One tab. The active tab is marked by the text tone plus a 2px underline that overlaps the bar’s hairline, so switching tabs never changes row height. It keeps a clear 1px border for crate::focus::focusable’s ring.

Dyn Compatibility§

This trait is not dyn compatible.

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

Implementations on Foreign Types§

Source§

impl Layout for Theme

Implementors§