gpui-component について
gpui-component を使って GPUI アプリ向けの再利用可能な UI コンポーネントを構築するためのガイドです。構造、トレイト、テーマ、オーバーレイ、フォーム、アニメーションの指針をまとめています。
主な機能
- 01コンポーネント設計パターン
- 02トレイト実装の指針
- 03テーマ対応のスタイル
- 04ダイアログとポップオーバー
- 05フォーム状態と検証
- 06アニメーションの指針
活用シーン
- 01再利用可能な GPUI コンポーネントの設計
- 02一貫したテーマとサイズの適用
- 03ダイアログ、ポップオーバー、シートの構築
- 04フォームやアニメーションの実装
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aprilnea/ gpui-skills --skill gpui-componentインストール後、Claude Code で/gpui-componentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
rules/_sections.mdanim-with-animation.mdcomp-renderonce.mdcomp-stateful.mdcomp-structure.mddialog-comparison.mddialog-root.mddialog-window-ext.mdform-input-state.mdtheme-colors.mdtheme-variants.mdtrait-disableable.mdtrait-sizable.mdtrait-styled.md詳細
gpui-component のベストプラクティス
GPUI アプリケーション向けコンポーネントライブラリである gpui-component を使って UI コンポーネントを構築するための包括的なガイドです。
適用する場面
以下の場合は、これらのガイドラインを参照してください。
- 再利用可能な UI コンポーネントを作成するとき
- テーマに対応したスタイルを実装するとき
- ダイアログ、ポップオーバー、シートを構築するとき
- フォームコンポーネント(Input、Checkbox など)を作成するとき
- コンポーネントのアニメーションを実装するとき
- Longbridge のコンポーネントパターンに従うとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | 接頭辞 |
|---|---|---|---|
| 1 | コンポーネントアーキテクチャ | CRITICAL | comp- |
| 2 | トレイトシステム | CRITICAL | trait- |
| 3 | テーマシステム | HIGH | theme- |
| 4 | ダイアログとポップオーバー | HIGH | dialog- |
| 5 | フォームコンポーネント | MEDIUM | form- |
| 6 | アニメーション | MEDIUM | anim- |
クイックリファレンス
1. コンポーネントアーキテクチャ(CRITICAL)
comp-renderonce- #[derive(IntoElement)] を使って RenderOnce を使用するcomp-structure- 標準的なコンポーネント構造のテンプレートcomp-builder- コンポーネントに流れるようなビルダーパターンを使用するcomp-stateful- 状態を持つコンポーネントには Entity と RenderOnce を使用するcomp-callbacks- イベントコールバックには Rc を使用する
2. トレイトシステム(CRITICAL)
trait-styled- スタイルをカスタマイズできるよう Styled を実装するtrait-disableable- 無効状態に対応するため Disableable を実装するtrait-selectable- 選択状態に対応するため Selectable を実装するtrait-sizable- Size enum とともに Sizable を実装するtrait-parent-element- 子要素に対応するため ParentElement を実装するtrait-interactive- イベントに対応するため InteractiveElement を実装する
3. テーマシステム(HIGH)
theme-colors- 一貫した色使いのために ThemeColor を使用するtheme-active- テーマにアクセスするには ActiveTheme トレイトを使用するtheme-variants- バリアント enum(ButtonVariant など)を実装するtheme-size-system- サイズに基づくスタイル設定には StyleSized を使用する
4. ダイアログとポップオーバー(HIGH)
dialog-root- ウィンドウのルートとして Root コンポーネントを使用するdialog-window-ext- ダイアログの管理には WindowExt を使用するdialog-confirm- 確認/アラートダイアログを実装するdialog-form- 入力状態を持つフォームダイアログを構築するpopover-pattern- Popover、PopupMenu、Sheet の使い分け
5. フォームコンポーネント(MEDIUM)
form-input-state- Entity ベースの入力状態管理form-focus- キー付き状態によるフォーカス管理form-validation- 入力検証のパターン
6. アニメーション(MEDIUM)
anim-with-animation- トランジションには with_animation を使用するanim-keyed-state- use_keyed_state でアニメーション状態を保持するanim-easing- 滑らかなアニメーションには cubic_bezier を使用する
コンポーネント構造のテンプレート
#[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)>>,
}
アーキテクチャの概要
┌─────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────┘
ポップアップコンポーネントの比較
| 機能 | Dialog | Popover | PopupMenu | Sheet |
|---|---|---|---|---|
| 位置 | 中央 | アンカー基準 | アンカー基準 | 側面 |
| オーバーレイ | あり | なし | なし | あり |
| 状態 | Root | keyed_state | Entity | Root |
| 重ね合わせ | 複数 | 1 つ | サブメニュー | 1 つ |
| 閉じ方 | ESC/クリック/ボタン | ESC/外側をクリック | ESC/選択 | ESC/オーバーレイ |
使用方法
詳しい説明とコード例については、各ルールファイルを参照してください。
rules/comp-renderonce.md
rules/trait-styled.md
rules/dialog-root.md
各ルールファイルには以下が含まれています。
- 重要である理由の簡単な説明
- 正しいパターンを示すコード例
- 避けるべきよくある間違い
コメント
Markdown 対応