Rust GUI components for building fantastic cross-platform desktop application by using GPUI.
npx skills add https://github.com/longbridge/gpui-component --skill gpui-element使用 CLI 安装这个技能,并在你的工作区中直接复用对应的 SKILL.md 工作流。
UI components for building fantastic desktop applications using GPUI.
RenderOnce components, simple and user-friendly.Theme and ThemeColor, supporting multi-theme and variable-based configurations.xs, sm, md, and lg.https://longbridge.github.io/gpui-component/gallery/
Here is the first application: Longbridge Pro, built using GPUI Component.
gpui = "0.2.2"
gpui-component = "0.5.1"
use gpui::*;
use gpui_component::{button::*, *};
pub struct HelloWorld;
impl Render for HelloWorld {
fn render(&mut self, _: &mut Window, _: &mut Context<Self>) -> impl IntoElement {
div()
.v_flex()
.gap_2()
.size_full()
.items_center()
.justify_center()
.child("Hello, World!")
.child(
Button::new("ok")
.primary()
.label("Let's Go!")
.on_click(|_, _, _| println!("Clicked!")),
)
}
}
fn main() {
let app = Application::new();
app.run(move |cx| {
// This must be called before using any GPUI Component features.
gpui_component::init(cx);
cx.spawn(async move |cx| {
cx.open_window(WindowOptions::default(), |window, cx| {
let view = cx.new(|_| HelloWorld);
// This first level on the window, should be a Root.
cx.new(|cx| Root::new(view, window, cx))
})
.expect("Failed to open window");
})
.detach();
});
}
GPUI Component has an Icon element, but it does not include SVG files by default.
The example uses Lucide icons, but you can use any icons you like. Just name the SVG files as defined in IconName. You can add any icons you need to your project.
The story crate is a gallery application that showcases all available components. Run it with:
cargo run
Some important examples are built into the story crate and can be run directly:
# Code editor with LSP support and syntax highlighting
cargo run --example editor
# Dock layout system (panels, split views, tabs)
cargo run --example dock
# Markdown rendering
cargo run --example markdown
# HTML rendering
cargo run --example html
The examples directory also contains standalone examples, each focused on a single feature. Each example is a separate crate, run them with cargo run -p <name>:
# Basic hello world
cargo run -p hello_world
# System monitor (real-time charts with CPU/memory data)
cargo run -p system_monitor
# Window title customization
cargo run -p window_title
You can also run the gallery in a web browser using WASM:
cd crates/story-web
# Install dependencies (first time only)
make install
# Build and run development server
make dev
The gallery will be available at http://localhost:3000
For more details, see crates/story-web/README.md.
Check out CONTRIBUTING.md for more details.
| Features | GPUI Component | Iced | egui | Qt 6 |
|---|---|---|---|---|
| Language | Rust | Rust | Rust | C++/QML |
| Core Render | GPUI | wgpu | wgpu | QT |
| License | Apache 2.0 | MIT | MIT/Apache 2.0 | Commercial/LGPL |
| Min Binary Size [^1] | 12MB | 11MB | 5M | 20MB [^2] |
| Cross-Platform | Yes | Yes | Yes | Yes |
| Documentation | Simple | Simple | Simple | Good |
| Web | Yes (WASM) | Yes | Yes | Yes |
| UI Style | Modern | Basic | Basic | Basic |
| CJK Support | Yes | Yes | Bad | Yes |
| Chart | Yes | No | No | Yes |
| Table (Large dataset) | Yes (Virtual Rows, Columns) |
No | Yes (Virtual Rows) |
Yes (Virtual Rows, Columns) |
| Table Column Resize | Yes | No | Yes | Yes |
| Text base | Rope | COSMIC Text [^3] | trait TextBuffer [^4] | QTextDocument |
| CodeEditor | Simple | Simple | Simple | Basic API |
| Dock Layout | Yes | Yes | Yes | Yes |
| Syntax Highlight | Tree Sitter | Syntect | Syntect | QSyntaxHighlighter |
| Markdown Rendering | Yes | Yes | Basic | No |
| Markdown mix HTML | Yes | No | No | No |
| HTML Rendering | Basic | No | No | Basic |
| Text Selection | TextView | No | Any Label | Yes |
| Custom Theme | Yes | Yes | Yes | Yes |
| Built Themes | Yes | No | No | No |
| I18n | Yes | Yes | Yes | Yes |
Please submit an issue or PR if any mistakes or outdated are found.
[^1]: Release builds by use simple hello world example.
[^2]: Reducing Binary Size of Qt Applications
[^3]: Iced Editor: https://github.com/iced-rs/iced/blob/db5a1f6353b9f8520c4f9633d1cdc90242c2afe1/graphics/src/text/editor.rs#L65-L68
[^4]: egui TextBuffer: https://github.com/emilk/egui/blob/0a81372cfd3a4deda640acdecbbaf24bf78bb6a2/crates/egui/src/widgets/text_edit/text_buffer.rs#L20
Apache-2.0