--- name: gpui-component description: 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. license: MIT metadata: author: AprilNEA version: "1.0.0" --- # 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 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, children: Vec, // 5. State configuration disabled: bool, selected: bool, size: Size, // 6. Callbacks on_click: Option>, } ``` ## Architecture Overview ``` ┌─────────────────────────────────────────────────────────────┐ │ Window │ │ ├── Root (Entity, manages overlay state) │ │ │ ├── view: AnyView (user's main view) │ │ │ ├── active_dialogs: Vec │ │ │ ├── active_sheet: Option │ │ │ └── notification: Entity │ │ │ │ │ └── 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