guise
Native UI · built on Zed's gpui

Native UI components
for Rust.

guise brings Mantine's ergonomics to gpui — a themed palette, sizing tokens, and roughly sixty composable components, GPU-rendered at native speed.

guise-ui = { git = "https://github.com/wess/guise" }
TextInput Button · variant Badge Switch Alert

The palette — 14 open-color hues, 10 shades each, read straight from the theme.

Everything you need to build a desktop app.

A complete component layer, not a widget grab-bag — themed, composable, and native from the first line.

Mantine palette, themed

A 14-hue open-color palette, sizing tokens, and semantic colors. Read every value from the theme — light / dark switching is free.

Builder API

Chainable builders that read like Mantine: .variant(), .color(), .size(), .radius().

Stateful entities

Inputs, overlays and data views are gpui entities that own their state and emit events you take with cx.subscribe.

Flex + macros

A Flutter-style flexbox layer plus terse row! / col! / zstack! macros for dense layout.

Reactive state

A lightweight React-style layer: Signal, use_state, provide / use_context, and use_form validation.

Native WebView

Embed a real OS web view (WKWebView / WebView2 / WebKitGTK) via wry, positioned inside normal guise layout.

If you know Mantine, you already know guise.

Controlled widgets take a value and a handler. Stateful ones are entities you create with cx.new and subscribe to. Same mental model — native rendering underneath.

Read the component model →
  • Variant + color + size on every component
  • Events via cx.subscribe, redraws via cx.notify
  • No hardcoded colors or spacing — only theme tokens
  • Drop to the flex layer or macros when you want them
text.rs
// a stateful entity: owns its buffer, emits events
let name = cx.new(|cx| {
    TextInput::new(cx)
        .label("Name")
        .placeholder("guise-app")
});

cx.subscribe(&name, |this, _input, e: &TextInputEvent, cx| {
    if let TextInputEvent::Change(value) = e {
        this.name = value.clone();
        cx.notify();
    }
})
.detach();

Roughly sixty components, one palette.

From buttons to a native web view — a selection of the families below.

01 Button variant · color · size docs →
Framework
gpui
02 Inputs TextInput · Select docs →
Sync
I agree
03 Controls Switch · Checkbox · Slider docs →
SavedAll changes synced.
04 Feedback Alert · Progress · Loader docs →
OverviewActivityMembers
WCADJR+3
05 Data Tabs · AvatarGroup docs →
ActionsDuplicateRenameDelete
06 Overlays Menu · Popover · Modal docs →
See every component in the gallery →

Systems, not just widgets.

Layout, motion and state — the parts of an app a component grab-bag leaves out.

See them all in one app — the data workbench tutorial →

Ready to get started?

Add the dependency and open your first window.

guise-ui = { git = "https://github.com/wess/guise" }