Shell — App Footer
Anatomy
Optional help/legal links, a version or copyright line, secondary columns and arbitrary content. The footer sits below the entire sidebar/content row, with quiet small text and safe-area padding.
maud_ui::blocks::shell::app_footer
Props
Generated from public Rust fields. Defaults are evaluated from the implementation.
| Prop | Type | Default | Description |
|---|---|---|---|
state | crate::blocks::state::State | Ready | Explicit presentation state; Ready preserves the ordinary content. |
links | Vec<Link> | [] | No description |
line | Option<String> | None | No description |
columns | Vec<Column> | [] | No description |
children | Markup | PreEscaped("") | No description |
Examples
Loading, empty, error and disabled
Each example uses the block’s state prop. Empty and error are separate outcomes.
loading
Loading…
empty
No items yet.
Add an itemerror
Could not load this section.
Try againdisabled
Editing is unavailable in this example.
Usage and composition
Import and example
use maud_ui::blocks::{action::Link, shell::{app_footer, sidebar}};
sidebar::render(sidebar::Props {
app_footer: app_footer::render(app_footer::Props {
line: Some("Garden House · Workspace 0.9".into()),
links: vec![Link { label: "Help".into(), href: "/help".into() }],
..Default::default()
}),
..Default::default()
});
Default props render nothing. An empty line and empty child markup also emit no footer. Secondary columns use a responsive grid; links wrap as whole items. There is no script requirement. See the sidebar showcase for the full header/footer composition in light and dark.
Presentation states (0.10.1)
Props::state: maud_ui::blocks::state::State defaults to Ready. Loading { message } shows skeletons; Empty { message, action } and Error { message, retry } provide distinct recovery paths; Disabled { reason } retains admitted content in an inert subtree with an external reason. Loading, empty and error omit ready content. Inert disables interaction, not server authorization or submission of values by an enclosing form. Each live API page shows all four states together. Add state: Default::default() to exhaustive Props literals.
State::Absent (0.11.0) means no input/rule was declared and emits nothing. Keep any caller-owned section heading inside the same conditional. Use Error only for a declared operation that failed; never show an unconfigured-rule message to the user.
Frame contract (0.12.0)
Density never moves the frame. Shell spacing, type and control heights use independent --mui-shell-* tokens. See shell frame for layout, current navigation and source migration details.
Accessibility
Supply meaningful labels, choose heading levels for the surrounding page, and preserve native link and form behavior. Keyboard focus follows document order. Motion honors reduced-motion preferences.