home / skills / zhanghandong / makepad-skills / makepad-widgets

makepad-widgets skill

/skills/makepad-widgets

This skill helps you build Makepad widget UIs by generating code patterns and answering questions about core widgets, rich text, and layouts.

npx playbooks add skill zhanghandong/makepad-skills --skill makepad-widgets

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
6.2 KB
---
name: makepad-widgets
description: |
  CRITICAL: Use for Makepad widgets and UI components. Triggers on:
  makepad widget, makepad View, makepad Button, makepad Label, makepad Image,
  makepad TextInput, RoundedView, SolidView, ScrollView, "makepad component",
  makepad Markdown, makepad Html, TextFlow, rich text, 富文本, markdown渲染,
  makepad 组件, makepad 按钮, makepad 列表, makepad 视图, makepad 输入框
---

# Makepad Widgets Skill

> **Version:** makepad-widgets (dev branch) | **Last Updated:** 2026-01-19
>
> Check for updates: https://crates.io/crates/makepad-widgets

You are an expert at Makepad widgets. Help users by:
- **Writing code**: Generate widget code following the patterns below
- **Answering questions**: Explain widget properties, variants, and usage

## Documentation

Refer to the local files for detailed documentation:
- `./references/widgets-core.md` - Core widgets (View, Button, Label, etc.)
- `./references/widgets-advanced.md` - Helper and advanced widgets
- `./references/widgets-richtext.md` - Rich text widgets (Markdown, Html, TextFlow)

## IMPORTANT: Documentation Completeness Check

**Before answering questions, Claude MUST:**

1. Read the relevant reference file(s) listed above
2. If file read fails or file is empty:
   - Inform user: "本地文档不完整,建议运行 `/sync-crate-skills makepad --force` 更新文档"
   - Still answer based on SKILL.md patterns + built-in knowledge
3. If reference file exists, incorporate its content into the answer

## Key Patterns

### 1. View (Basic Container)

```rust
<View> {
    width: Fill
    height: Fill
    flow: Down
    padding: 16.0
    show_bg: true
    draw_bg: { color: #1A1A1A }

    <Label> { text: "Content" }
}
```

### 2. Button

```rust
<Button> {
    text: "Click Me"
    draw_bg: {
        color: #0066CC
        color_hover: #0088FF
        border_radius: 4.0
    }
    draw_text: {
        color: #FFFFFF
        text_style: { font_size: 14.0 }
    }
}
```

### 3. Label with Styling

```rust
<Label> {
    width: Fit
    height: Fit
    text: "Hello World"
    draw_text: {
        color: #FFFFFF
        text_style: {
            font_size: 16.0
            line_spacing: 1.4
        }
    }
}
```

### 4. Image

```rust
<Image> {
    width: 200.0
    height: 150.0
    source: dep("crate://self/resources/photo.png")
    fit: Contain
}
```

### 5. TextInput

```rust
<TextInput> {
    width: Fill
    height: Fit
    text: "Default value"
    draw_text: {
        text_style: { font_size: 14.0 }
    }
}
```

## Widget Traits (from source)

```rust
pub trait WidgetNode: LiveApply {
    fn find_widgets(&self, path: &[LiveId], cached: WidgetCache, results: &mut WidgetSet);
    fn walk(&mut self, cx: &mut Cx) -> Walk;
    fn area(&self) -> Area;
    fn redraw(&mut self, cx: &mut Cx);
}

pub trait Widget: WidgetNode {
    fn handle_event(&mut self, cx: &mut Cx, event: &Event, scope: &mut Scope) {}
    fn draw_walk(&mut self, cx: &mut Cx2d, scope: &mut Scope, walk: Walk) -> DrawStep;
    fn draw(&mut self, cx: &mut Cx2d, scope: &mut Scope) -> DrawStep;
    fn widget(&self, path: &[LiveId]) -> WidgetRef;
}
```

## All Built-in Widgets (84 files in widgets/src/)

| Category | Widgets |
|----------|---------|
| **Basic** | `View`, `Label`, `Button`, `Icon`, `Image` |
| **Input** | `TextInput`, `CheckBox`, `RadioButton`, `Slider`, `DropDown`, `ColorPicker` |
| **Container** | `ScrollBars`, `PortalList`, `FlatList`, `StackNavigation`, `Dock`, `Splitter` |
| **Navigation** | `TabBar`, `Tab`, `FoldHeader`, `FoldButton`, `ExpandablePanel` |
| **Overlay** | `Modal`, `Tooltip`, `PopupMenu`, `PopupNotification` |
| **Media** | `Video`, `RotatedImage`, `ImageBlend`, `MultiImage` |
| **Layout** | `AdaptiveView`, `SlidePanel`, `PageFlip`, `SlidesView` |
| **Special** | `Markdown`, `Html`, `TextFlow`, `WebView`, `KeyboardView` |
| **Utility** | `LoadingSpinner`, `DesktopButton`, `LinkLabel`, `ScrollShadow` |

## Core Widgets Reference

| Widget | Purpose | Key Properties |
|--------|---------|----------------|
| `View` | Container | `flow`, `align`, `show_bg`, `draw_bg`, `optimize` |
| `Button` | Clickable | `text`, `draw_bg`, `draw_text`, `draw_icon` |
| `Label` | Text display | `text`, `draw_text` |
| `Image` | Image display | `source`, `fit` |
| `TextInput` | Text entry | `text`, `draw_text`, `draw_cursor`, `draw_selection` |
| `CheckBox` | Toggle | `text`, `selected` |
| `RadioButton` | Selection | `text`, `selected` |
| `Slider` | Value slider | `min`, `max`, `step` |
| `DropDown` | Select menu | `labels`, `selected` |
| `PortalList` | Virtual list | Efficient scrolling for large lists |
| `Modal` | Dialog | Overlay dialog boxes |
| `Tooltip` | Hint | Hover tooltips |

## View Variants

| Variant | Description |
|---------|-------------|
| `SolidView` | Solid background color |
| `RoundedView` | Rounded corners |
| `RoundedAllView` | Individual corner control |
| `RectView` | Rectangle with border/gradient |
| `CircleView` | Circle/ellipse shape |
| `GradientXView` | Horizontal gradient |
| `GradientYView` | Vertical gradient |
| `RoundedShadowView` | Rounded with shadow |
| `ScrollXView` | Horizontal scroll |
| `ScrollYView` | Vertical scroll |
| `ScrollXYView` | Both directions scroll |
| `CachedView` | Texture-cached |

## Button Variants

| Variant | Description |
|---------|-------------|
| `ButtonFlat` | Flat style |
| `ButtonFlatIcon` | Flat with icon |
| `ButtonFlatter` | No background |
| `ButtonGradientX` | Horizontal gradient |
| `ButtonGradientY` | Vertical gradient |
| `ButtonIcon` | Standard with icon |

## ImageFit Values

| Value | Description |
|-------|-------------|
| `Stretch` | Stretch to fill |
| `Contain` | Fit within, preserve ratio |
| `Cover` | Cover area, may crop |
| `Fill` | Fill without ratio |

## When Writing Code

1. Always set `width` and `height` on widgets
2. Use `show_bg: true` to enable background rendering
3. Access `draw_bg`, `draw_text`, `draw_icon` for shader uniforms
4. Use `dep("crate://self/...")` for resource paths
5. Choose appropriate View variant for visual needs

## When Answering Questions

1. Recommend UI Zoo example for widget exploration
2. View is the base container - most visual widgets inherit from it
3. Draw shaders (`draw_bg`, `draw_text`) control appearance
4. All widgets support animation through `animator` property

Overview

This skill provides expert guidance and code generation for Makepad widgets and UI components. It focuses on common widgets (View, Button, Label, Image, TextInput) and advanced/rich-text widgets (Markdown, Html, TextFlow). The skill validates local reference docs before answering and falls back to built-in patterns when needed.

How this skill works

Before producing code or explanations the skill checks local reference files (widgets-core.md, widgets-advanced.md, widgets-richtext.md). If the references are present it incorporates their guidance; if a read fails it notifies the user and continues using built-in patterns. It generates idiomatic Makepad Live Rust snippets, explains widget properties, variants, and usage, and follows established patterns (always set width/height, use show_bg, use dep(...) for resources).

When to use it

  • Designing layouts and containers using View and its variants (SolidView, RoundedView).
  • Creating interactive elements like Button, TextInput, CheckBox, and RadioButton.
  • Rendering images and choosing image fit modes (Contain, Cover, Stretch).
  • Building rich text content with Markdown, Html, or TextFlow widgets.
  • Implementing lists and navigation (PortalList, FlatList, TabBar, StackNavigation).

Best practices

  • Always set width and height explicitly on widgets to avoid layout surprises.
  • Use show_bg: true and configure draw_bg/draw_text/draw_icon for consistent visuals.
  • Use dep("crate://self/...") for bundled resource paths to ensure portability.
  • Pick the appropriate View variant (RoundedView, ScrollYView, CachedView) for the visual and performance needs.
  • Leverage animator property for animations and keep shaders in draw_* for appearance control.

Example use cases

  • Compose a settings panel: a View flow Down with Labels, TextInput, and Buttons styled via draw_bg/draw_text.
  • Create an image gallery using Image widgets with fit: Contain and a PortalList for virtualized scrolling.
  • Render formatted documentation or blog posts using the Markdown widget and custom text styles.
  • Build a chat input area using TextInput, a Send Button, and a Floating RoundedView for notifications.
  • Implement a responsive toolbar with ButtonFlatIcon variants and adaptive View containers.

FAQ

What happens if the local reference files are missing?

Local documentation is incomplete; please run /sync-crate-skills makepad --force to update the references. The skill will still answer using built-in patterns when references are unavailable.

Which View variant should I choose for rounded cards with shadow?

Use RoundedShadowView for rounded corners with shadows. For simple rounded corners without shadow use RoundedView or RoundedAllView for per-corner control.