# Gpui Component

> gpui-component library patterns for building reusable UI components. Use when creating buttons, inputs, dialogs, forms, or following Longbridge component library conventions in GPUI applications.

- Skill: `aprilnea/gpui-component` (Agent Skill, multi-file: 15 files)
- Install (CLI): `npx skillmds@latest add aprilnea/gpui-component`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aprilnea/gpui-component/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- License: MIT
- Author: aprilnea (https://skillmd.com/u/aprilnea)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/aprilnea/gpui-component

---


# gpui-component Best Practices

Comprehensive guide for building UI components with [gpui-component](https://github.com/longbridge/gpui-component), a component library for GPUI applications.

## When to Apply

Reference these guidelines when:
- Creating reusable UI components
- Implementing theme-aware styling
- Building dialogs, popovers, or sheets
- Creating form components (Input, Checkbox, etc.)
- Implementing component animations
- Following Longbridge component patterns

## Rule Categories by Priority

| Priority | Category | Impact | Prefix |
|----------|----------|--------|--------|
| 1 | Component Architecture | CRITICAL | `comp-` |
| 2 | Trait System | CRITICAL | `trait-` |
| 3 | Theme System | HIGH | `theme-` |
| 4 | Dialog & Popover | HIGH | `dialog-` |
| 5 | Form Components | MEDIUM | `form-` |
| 6 | Animation | MEDIUM | `anim-` |

## Quick Reference

### 1. Component Architecture (CRITICAL)

- `comp-renderonce` - Use RenderOnce with #[derive(IntoElement)]
- `comp-structure` - Standard component structure template
- `comp-builder` - Fluent builder pattern for components
- `comp-stateful` - Entity + RenderOnce for stateful components
- `comp-callbacks` - Use Rc<dyn Fn> for event callbacks

### 2. Trait System (CRITICAL)

- `trait-styled` - Implement Styled for style customization
- `trait-disableable` - Implement Disableable for disabled state
- `trait-selectable` - Implement Selectable for selection state
- `trait-sizable` - Implement Sizable with Size enum
- `trait-parent-element` - Implement ParentElement for children
- `trait-interactive` - Implement InteractiveElement for events

### 3. Theme System (HIGH)

- `theme-colors` - Use ThemeColor for consistent colors
- `theme-active` - Use ActiveTheme trait for theme access
- `theme-variants` - Implement variant enums (ButtonVariant, etc.)
- `theme-size-system` - Use StyleSized for size-based styling

### 4. Dialog & Popover (HIGH)

- `dialog-root` - Use Root component as window root
- `dialog-window-ext` - Use WindowExt for dialog management
- `dialog-confirm` - Implement confirm/alert dialogs
- `dialog-form` - Build form dialogs with input state
- `popover-pattern` - Popover vs PopupMenu vs Sheet selection

### 5. Form Components (MEDIUM)

- `form-input-state` - Entity-based input state management
- `form-focus` - Focus management with keyed state
- `form-validation` - Input validation patterns

### 6. Animation (MEDIUM)

- `anim-with-animation` - Use with_animation for transitions
- `anim-keyed-state` - Persist animation state with use_keyed_state
- `anim-easing` - Use cubic_bezier for smooth animations

## Component Structure Template

```rust
#[derive(IntoElement)]
pub struct MyComponent {
    // 1. Identifier
    id: ElementId,

    // 2. Base element (for event delegation)
    base: Div,

    // 3. Style override
    style: StyleRefinement,

    // 4. Content
    label: Option<SharedString>,
    children: Vec<AnyElement>,

    // 5. State configuration
    disabled: bool,
    selected: bool,
    size: Size,

    // 6. Callbacks
    on_click: Option<Rc<dyn Fn(&ClickEvent, &mut Window, &mut App)>>,
}
```

## Architecture Overview

```
┌─────────────────────────────────────────────────────────────┐
│  Window                                                      │
│  ├── Root (Entity, manages overlay state)                   │
│  │   ├── view: AnyView (user's main view)                   │
│  │   ├── active_dialogs: Vec<ActiveDialog>                  │
│  │   ├── active_sheet: Option<ActiveSheet>                  │
│  │   └── notification: Entity<NotificationList>             │
│  │                                                          │
│  └── Render Layers                                          │
│      ├── Layer 0: Root.view (main content)                  │
│      ├── Layer 1: Sheet (side drawer)                       │
│      ├── Layer 2: Dialogs (stackable)                       │
│      └── Layer 3: Notifications                             │
└─────────────────────────────────────────────────────────────┘
```

## Popup Component Comparison

| Feature | Dialog | Popover | PopupMenu | Sheet |
|---------|--------|---------|-----------|-------|
| Position | Centered | Anchored | Anchored | Side |
| Overlay | Yes | No | No | Yes |
| State | Root | keyed_state | Entity | Root |
| Stacking | Multiple | Single | Submenus | Single |
| Close | ESC/Click/Button | ESC/Outside | ESC/Select | ESC/Overlay |

## How to Use

Read individual rule files for detailed explanations and code examples:

```
rules/comp-renderonce.md
rules/trait-styled.md
rules/dialog-root.md
```

Each rule file contains:
- Brief explanation of why it matters
- Code examples with correct patterns
- Common mistakes to avoid

