Skip to main content

gpui-init

Initialize new GPUI application projects with proper structure and boilerplate. Use when creating a new GPUI app, setting up project structure, or scaffolding a cross-platform Rust desktop UI application.

소스 정보

저장소
zerx-lab/rmx
최근 소스 활동
2026년 2월 5일 09:49
감지된 SKILL.md 언어
영어
스타
70
포크
2

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
gpui-init
description
Initialize new GPUI application projects with proper structure and boilerplate. Use when creating a new GPUI app, setting up project structure, or scaffolding a cross-platform Rust desktop UI application.
# GPUI Project Initialization This skill enables you to scaffold new GPUI application projects with proper structure, dependencies, and boilerplate code. ## Overview When creating a new GPUI project, generate the appropriate files based on project complexity: - **Simple app**: Minimal structure for learning/prototyping (single file) - **Production app**: Full structure with modules and components ## Simple App Template ### Directory Structure ``` my_app/ ├── Cargo.toml ├── src/ │ └── main.rs └── .gitignore ``` ### Cargo.toml ```toml [package] name = "my-app" version = "0.1.0" edition = "2021" description = "A GPUI application" license = "MIT" [dependencies] gpui = "0.2.2" ``` ### src/main.rs ```rust use gpui::*; struct HelloWorld { counter: usize, } impl Render for HelloWorld { fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement { div() .flex() .flex_col() .gap_4() .size_full() .items_center() .justify_center() .child(format!("Counter: {}", self.counter)) .child( div() .px_4() .py_2() .bg(rgb(0x3b82f6)) .text_color(rgb(0xffffff)) .rounded(px(4.0)) .child("Click Me") .on_click(|_event, _window, cx| { println!("Clicked!"); }) ) } } fn main() { let app = Application::new(); app.run(move |cx| { cx.spawn(async move |cx| { cx.open_window(WindowOptions::default(), |window, cx| { cx.new(|_cx| HelloWorld { counter: 0 }) })?; Ok::<_, anyhow::Error>(()) }) .detach(); }); } ``` ### .gitignore ``` /target .DS_Store *.swp *.swo .idea/ .vscode/ Cargo.lock ``` ## Production App Template ### Directory Structure ``` my_app/ ├── Cargo.toml ├── src/ │ ├── main.rs │ ├── app.rs │ ├── ui/ │ │ ├── mod.rs │ │ └── home.rs │ └── shared/ │ ├── mod.rs │ └── theme.rs ├── .gitignore └── rust-toolchain.toml ``` ### Cargo.toml (Production) ```toml [package] name = "my-app" version = "0.1.0" edition = "2021" description = "A cross-platform GPUI application" license = "MIT" authors = ["Your Name <your@email.com>"] [dependencies] gpui = "0.2.2" anyhow = "1.0" [features] default = [] [profile.release] opt-level = 3 lto = "thin" ``` ### src/main.rs (Production) ```rust mod app; mod ui; mod shared; fn main() { app::run(); } ``` ### src/app.rs ```rust use gpui::*; use crate::ui::home::HomeView; pub fn run() { let app = Application::new(); app.run(move |cx| { cx.spawn(async move |cx| { cx.open_window( WindowOptions { window_bounds: Some(WindowBounds::Windowed(Bounds { origin: Point { x: px(100.0), y: px(100.0) }, size: Size { width: px(1024.0), height: px(768.0) }, })), titlebar: Some(TitlebarOptions { title: Some("My App".into()), appears_transparent: false, ..Default::default() }), ..Default::default() }, |window, cx| { cx.new(|_cx| HomeView::new()) } )?; Ok::<_, anyhow::Error>(()) }) .detach(); }); } ``` ### src/ui/mod.rs ```rust pub mod home; ``` ### src/ui/home.rs ```rust use gpui::*; use crate::shared::theme; pub struct HomeView { counter: usize, } impl HomeView { pub fn new() -> Self { Self { counter: 0 } } fn increment(&mut self, _window: &mut Window, cx: &mut Context<Self>) { self.counter += 1; cx.notify(); } } impl Render for HomeView { fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement { div() .flex() .flex_col() .gap_6() .size_full() .p_8() .bg(theme::BG_COLOR) .child( div() .text_2xl() .font_bold() .text_color(theme::TEXT_COLOR) .child("Welcome to GPUI") ) .child( div() .flex() .flex_col() .gap_4() .p_6() .bg(theme::CARD_BG) .rounded(px(8.0)) .child( div() .text_lg() .text_color(theme::TEXT_COLOR) .child(format!("Counter: {}", self.counter)) ) .child( div() .px_6() .py_3() .bg(theme::PRIMARY_COLOR) .text_color(rgb(0xffffff)) .rounded(px(6.0)) .cursor_pointer() .child("Increment") .on_click(cx.listener(Self::increment)) ) ) } } ``` ### src/shared/mod.rs ```rust pub mod theme; ``` ### src/shared/theme.rs ```rust use gpui::*; pub const BG_COLOR: Hsla = hsla(0.0, 0.0, 0.05, 1.0); pub const CARD_BG: Hsla = hsla(0.0, 0.0, 0.1, 1.0); pub const TEXT_COLOR: Hsla = hsla(0.0, 0.0, 0.9, 1.0); pub const PRIMARY_COLOR: Hsla = hsla(0.6, 0.8, 0.5, 1.0); ``` ### rust-toolchain.toml ```toml [toolchain] channel = "stable" ``` ## Optional: Using Pre-built Components > [!NOTE] > For pre-built UI components (similar to shadcn/ui), see the **gpui-component-usage** skill. ## Project Checklist When initializing a new project, ensure: - [ ] `Cargo.toml` has correct package metadata - [ ] `gpui` dependency is version `0.2.2` or later - [ ] `main.rs` initializes `Application::new()` - [ ] Window is created with `cx.open_window()` - [ ] `.gitignore` excludes `/target` and IDE files - [ ] `rust-toolchain.toml` specifies stable channel ## References - [GPUI Documentation](https://gpui.rs) - [Zed Repository](https://github.com/zed-industries/zed)
GitHub에서 보기