Install any skill in seconds. Free to start, no credit card required.
Get Started Free →CRITICAL: Use for Makepad getting started and app structure. Triggers on: makepad, makepad getting started, makepad tutorial, live_design!, app_main!, makepad project setup, makepad hello world, "how to create makepad app", makepad 入门, 创建 makepad 应用, makepad 教程, makepad 项目结构
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 55% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 23% | 0% |
> Version: makepad-widgets (dev branch) | Last Updated: 2026-01-19 > > Check for updates: https://crates.io/crates/makepad-widgets
You are an expert at the Rust makepad-widgets crate. Help users by:
live_design!, app_main!, or first-screen application wiring.Refer to the local files for detailed documentation:
./references/app-structure.md - Complete app boilerplate and structure./references/event-handling.md - Event handling patternsBefore answering questions, Claude MUST:
/sync-crate-skills makepad --force 更新文档"rustuse makepad_widgets::*; live_design! { use link::theme::*; use link::shaders::*; use link::widgets::*; App = {{App}} { ui: <Root> { main_window = <Window> { body = <View> { width: Fill, height: Fill flow: Down <Label> { text: "Hello Makepad!" } } } } } } app_main!(App); #[derive(Live, LiveHook)] pub struct App { #[live] ui: WidgetRef, } impl LiveRegister for App { fn live_register(cx: &mut Cx) { crate::makepad_widgets::live_design(cx); } } impl AppMain for App { fn handle_event(&mut self, cx: &mut Cx, event: &Event) { self.ui.handle_event(cx, event, &mut Scope::empty()); } }
toml[package] name = "my_app" version = "0.1.0" edition = "2024" [dependencies] makepad-widgets = { git = "https://github.com/makepad/makepad", branch = "dev" }
rustimpl AppMain for App { fn handle_event(&mut self, cx: &mut Cx, event: &Event) { let actions = self.ui.handle_event(cx, event, &mut Scope::empty()); if self.ui.button(id!(my_button)).clicked(&actions) { log!("Button clicked!"); } } }
rust// Get widget references let label = self.ui.label(id!(my_label)); label.set_text("Updated text"); let input = self.ui.text_input(id!(my_input)); let text = input.text();
| Macro/Type | Description | Example | |------------|-------------|---------| | live_design! | Defines UI in DSL | live_design! { App = {{App}} { ... } } | | app_main! | Entry point macro | app_main!(App); | | #[derive(Live)] | Derive live data | #[derive(Live, LiveHook)] | | WidgetRef | Reference to UI tree | #[live] ui: WidgetRef | | Cx | Context for rendering | fn handle_event(&mut self, cx: &mut Cx, ...) | | id!() | Widget ID macro | self.ui.button(id!(my_button)) |
| Platform | Requirements | |----------|--------------| | macOS | Works out of the box | | Windows | Works out of the box | | Linux | apt-get install clang libaudio-dev libpulse-dev libx11-dev libxcursor-dev | | Web | cargo install wasm-pack |
use makepad_widgets::*;live_design! macro for all UI definitionsLiveRegister and AppMain traitsid!() macro for widget referenceshandle_event methodOther measured skills in the registry, with their headline benchmark lift.