mcpField
G
gpui-kit

gpui-kit

github.com/longbridge開発18.7k1.1k 回インストール今日更新
リポジトリ

gpui-kit について

gpui-kitは、Rustのgpui-kit crateを使ったアプリケーション開発をコーディングエージェントに案内するスキルです。設計・コーディングガイドの参照を必須とし、フォーム、フィードバック、オーバーレイ、ナビゲーション、データ表示のコンポーネントを紹介します。

主な機能

  1. 01crateのレイヤーと状態所有のガイド
  2. 02設計・コーディングガイドの参照
  3. 03UIコンポーネント一覧
  4. 04ステートフル/ステートレスな部品のパターン
  5. 05テーマ、オーバーレイ、レイアウトの指針

活用シーン

  1. 01UIタスクに適したコンポーネントの選択
  2. 02フォームや操作コントロールの実装
  3. 03オーバーレイとナビゲーションを備えた画面の構築

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/longbridge/gpui-kit --skill gpui-kit

インストール後、Claude Code で/gpui-kitを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
coding-guides.md
conventions.md
recipes.md
usage.md
references/gpui/
action.md
async.md
context.md
element-advanced.md
element-api.md
element-best-practices.md
element-examples.md
element-id.md
element-patterns.md
element.md
entity-advanced.md
entity-api.md
entity-best-practices.md
entity-patterns.md
entity.md
event.md
focus-handle.md
global.md
layout-style.md
test-examples.md
test-reference.md
test.md

詳細

GPUI Kit

アプリケーションは単一のクレート gpui-kit に依存します。GPUI は use gpui_kit::*; で利用でき、各レイヤーには名前を指定してアクセスできます。gpui_kit::component(スタイル付きコンポーネント)、gpui_kit::base(スタイルなしの動作)、gpui_kit::assets(デフォルトのアイコン)、gpui_kit::platform です。

タスクに適したコンストラクター、状態の所有者、イベント、レイアウトの契約を選ぶには、まずコンポーネントファミリーの規約を確認してください。ファミリーの仕組みを把握したうえで、対象のコンポーネントが必要な機能に対応していることを確認します。

状態の保持、サブスクリプション、オーバーレイレイヤーを含む、コンパイル済みの完全なビューについては、テスト済みアプリケーションのレシピをお読みください。

まずガイドを読む

このスキルが前提とするルールは、2 つのガイドに記載されています。これらは必須要件であり、参考資料ではありません。このページや、コードベース内の類似ファイル、トレーニングデータをもとに回答せず、ガイドファイル自体をお読みください。

ガイド読むタイミング
Design Guides、スキル gpui-kit-design-guidesコンポーネント、レイアウト、間隔、階層、色、密度、インタラクション状態、オーバーレイ、モーション、インターフェース文言を選ぶ前
コーディングガイドクレートのレイヤー構造、RenderOnce と Entity<T> の使い分け、状態の所有者、ElementId、イベント、フォーカス、非同期処理、公開 API、命名、テストを扱う前

変更が画面に表示される部分に関わる場合は、まず Design Guides をお読みください。コード構造はプロダクトの意図を保つものであり、その代わりになるものではありません。デザインスキルがインストールされていない場合は、https://gpui-kit.com/docs/design-guides.md を取得してください。コーディングガイドは https://gpui-kit.com/docs/coding-guides.md の完全なコピーです。そのため、ガイド内の ./design-guides.md と ./getting-started.md へのリンクは、それぞれデザインスキルと https://gpui-kit.com/docs/getting-started.md を指します。

コーディングガイドのセクション一覧

新しいクレート、モジュール、機能に取り組む場合は、ガイド全体を読んでください。変更範囲が限定的な場合は、まず「アーキテクチャの概要」と「コーディングエージェント向けルール」を読み、次に変更に該当するセクションを読んでください(grep -n '^## ' references/coding-guides.md)。

セクション読むタイミング
アーキテクチャの概要常に。クレートのレイヤー構成、所有権の境界を確認するとき
ブートストラップとルートの所有権main、init、Root、ウィンドウの作成、アプリケーションレベルの状態を扱うとき
GPUI のフェーズとコンテキストを理解するApp、Window、Context<T>、レンダリングと更新の区別に関わるものを扱うとき
適切な単位を選ぶRenderOnce、Entity<T>、カスタム Element のどれを使うか決めるとき
状態の所有権状態の保存場所、変更する主体、Entity<State> のハンドルを確認するとき
安定した識別子ElementId、リスト、繰り返し要素、キー付き状態を扱うとき
レンダリングと合成render、ビルダーチェーン、when/map、子要素の合成を扱うとき
振る舞いと表示の境界gpui-base、gpui-component、アプリケーションコードのどこに実装するか決めるとき
テーマとスタイルcx.theme()、トークン、Styled、サイズ、バリアントを扱うとき
イベント、アクション、フォーカスcx.emit、subscribe、actions!、キーバインド、FocusHandle を扱うとき
非同期処理と副作用cx.spawn、background_spawn、Task、I/O、タイマーを扱うとき
レイアウト、測定、スクロールフレックスレイアウト、サイズ指定、overflow、スクロールハンドル、測定を扱うとき
リスト、テーブル、大量のデータVirtualList、List、DataTable、デリゲート、大規模なコレクションを扱うとき
パブリック API の設計pub を使うものすべて。ビルダー、非公開フィールド、セッターとリーダーの命名を確認するとき
プラットフォームと機能の境界macOS/Windows/Linux/wasm の違い、フィーチャーゲートを扱うとき
ファイルと命名規則新しいファイル、モジュール、型とメソッドの名前、Kind サフィックス、Context を扱うとき
テスト戦略何をテストするか、#[gpui_kit::test]、TestAppContext を扱うとき
パフォーマンスルールレンダリングコスト、アロケーション、再レンダリングのトリガーを確認するとき
よくある失敗作業を終える前に確認。存在しない API の創作、レンダリング中の状態変更、インデックス ID など
コーディングエージェント向けルールエージェントがコードを書く場合は常に読むこと
実装チェックリスト作業を終える前に確認。作業内容に照らして各項目を確認すること
必ず守ること

ガイドの代わりではなく、最低限守るべき事項です。

  • API を決して創作しないでください。 現在のソースコードを検索して、実際のシグネチャを確認してください。 React、CSS、または古い GPUI の例を類推して書き換えないでください。 もっともらしく見えても実在しないメソッドを使うことが、最もよくある失敗です。
  • 依存関係は 1 つだけです。 アプリケーションが依存するのは gpui-kit のみです。GPUI は use gpui_kit::*; で使用します。各レイヤーは gpui_kit::component、gpui_kit::base、 gpui_kit::assets、gpui_kit::platform です。
  • 振る舞いはフレームワーク、表示はアプリケーションが担います。 gpui-base に色、サイズ指定、 レイアウトを含めないでください。アプリケーションのスタイル設定コードにインタラクションの振る舞いを含めないでください。
  • 安定した識別子を使ってください。 繰り返し表示する要素には、リストのインデックスではなく、 ドメインに基づく ElementId が必要です。
  • 境界を越えて pub フィールドを公開しないでください。 パブリックなデータ型には、ビルダーと読み取り用メソッドを使ってください。
  • Context は省略せずに書いてください。 cx は GPUI のものです。それ以外の名前は、保持する内容に基づけてください。

ドキュメント

  • タスク/コンポーネントのページを探す:https://gpui-kit.com/llms.txt を使用し、該当する Markdown ページを読み込みます。
  • 完全なリファレンス:広範なリファレンスが実際に必要な場合は、https://gpui-kit.com/llms-full.txt を利用できます
  • コンポーネントごとの API:https://gpui-kit.com/component/{name}.md を取得します。 例:button.md、input.md、select.md、dialog.md、data-table.md
  • サイト内の任意のページは、URL の末尾に .md を追加することで Markdown として取得できます

クイックリファレンス

セットアップと例:references/usage.md。

use gpui_kit::*;

gpui_kit::application()
    .with_assets(gpui_kit::assets::Assets)
    .run(|cx| {
        gpui_kit::init(cx);                       // first, before anything else
        gpui_kit::open_window(options, cx, |window, cx| {
            cx.new(|cx| AppView::new(window, cx))
        })
        .expect("failed to open window");
    });
  • ステートレス(RenderOnce):render 内で構築します: Button::new("save").primary().label("Save").on_click(|_, _, _| {})
  • ステートフル:ビュー内で Entity<State> を保持し、render で参照を渡します: let input = cx.new(|cx| InputState::new(window, cx)); の後に Input::new(&self.input)
  • サイズ:.xsmall() .small() .medium()(デフォルト).large()
  • テーマ:cx.theme().primary · .background · .foreground · .border · .muted
  • オーバーレイ:gpui_kit::component::WindowExt を介して window.open_dialog(...)、open_sheet(...)、push_notification(...)

コンポーネントカタログ

インポートパスは gpui_kit::component:: からの相対パスです。そのため、input::{Input, InputState} は use gpui_kit::component::input::{Input, InputState}; を意味します。完全な API については、 コンポーネントの .md ドキュメントを取得してください。

入力とフォーム
ComponentImportNotes
Inputinput::{Input, InputState}ステートフル。テキスト、パスワード、マスク、検証
Textareainput::{Textarea, TextareaState}ステートフル。複数行テキスト
Editorinput::{Editor, EditorState}ステートフル。コードエディター、tree-sitter 機能
NumberInputinput::{NumberInput, NumberInputEvent}ステートフル。ステップ付きの数値入力
OtpInputinput::OtpInputステートフル。ワンタイムパスワード
SpeechButtonspeech::{SpeechButton, SpeechState}ステートフル。音声入力、speech 機能
Selectselect::{Select, SelectState}ステートフル。ドロップダウン式の選択
Comboboxcombobox::{Combobox, ComboboxState}ステートフル。検索可能な選択
Checkboxcheckbox::Checkboxステートレス。on_click は &bool を受け取ります
Switchswitch::Switchステートレス。切り替え
Radioradio::{Radio, RadioGroup}ステートレス。
Sliderslider::{Slider, SliderState}ステートフル。
Togglebutton::Toggleステートレス。
Ratingrating::Ratingステートレス。
Stepperstepper::Stepperステートレス。複数ステップの進捗表示
ColorPickercolor_picker::{ColorPicker, ColorPickerState}ステートフル。
DatePickerdate_picker::{DatePicker, DatePickerState}ステートフル。
TimeFieldtime_field::{TimeField, TimeFieldState}ステートフル。時刻、24 時間/12 時間形式
Calendarcalendar::{Calendar, CalendarState}ステートフル。インラインの月表示
Formform::{v_form, h_form, field}フォームフィールド用のレイアウトコンテナー
表示とフィードバック
コンポーネントインポート備考
Buttonbutton::{Button, ButtonGroup}ステートレス。主要な UI 操作
Icon{Icon, IconName}ステートレス。Lucide アイコン
Badgebadge::Badgeステートレス。
Tagtag::Tagステートレス。閉じられるタグ
Avataravatar::Avatarステートレス。
Labellabel::Labelステートレス。フォームラベル
Kbdkbd::Kbdステートレス。キーボードキーの表示
Alertalert::Alertステートレス。情報/成功/警告/エラー
Spinnerspinner::Spinnerステートレス。読み込みインジケーター
Skeletonskeleton::Skeletonステートレス。読み込み用プレースホルダー
Shimmershimmer::{ShimmerText, ShimmerStyle}ステートレス。ストリーミングテキストのシマー
Markermarker::{Marker, MarkerVariant}ステートレス。インラインのステータスマーカー
Progressprogress::{Progress, ProgressCircle}ステートレス。
Tooltiptooltip::Tooltip要素に対する .tooltip() 経由
HoverCardhover_card::{HoverCard, HoverCardState}ステートフル。
Clipboardclipboard::Clipboardステートレス。コピーボタン
TextViewtext::TextViewTextView::markdown(id, text)。HTML にも対応
画像gpui_kit::{img, ImageSource, ObjectFit}GPUI の img() 要素
オーバーレイとポップアップ
コンポーネントインポート備考
Dialogdialog::Dialog + WindowExtwindow.open_dialog(...) 経由
AlertDialogWindowExtwindow.open_alert_dialog(...) 経由
Sheetsheet::Sheet + WindowExtサイドパネル。window.open_sheet(...) 経由
Notificationnotification::Notification + WindowExtwindow.push_notification(...) 経由
Popoverpopover::Popoverフローティングオーバーレイ
Menumenu::{PopupMenu, DropdownMenu}コンテキストメニュー
DropdownButtonbutton::DropdownButtonドロップダウンメニュー付きボタン
Commandcommand::{Command, CommandState, CommandGroup}ステートフル。コマンドパレット
フォーカストラップFocusTrapElementコンテナーに対する .focus_trap(id, &handle)。Dialog と Sheet には組み込み済み
ナビゲーションとレイアウト
コンポーネントインポート備考
Tabs / TabBartab::{Tab, TabBar}タブ付きインターフェース
Sidebarsidebar::{Sidebar, SidebarMenu, ...}アプリのナビゲーションパネル
TitleBarTitleBarウィンドウのタイトルバー
StatusBarstatus_bar::StatusBarウィンドウのステータスバー
Breadcrumbbreadcrumb::Breadcrumbナビゲーション用パンくずリスト
Paginationpagination::Paginationページナビゲーション
Accordionaccordion::Accordion折りたたみ可能なセクション
Collapsiblecollapsible::Collapsible単一の折りたたみ可能な項目
GroupBoxgroup_box::GroupBoxラベル付きコンテナー
Resizableresizable::{h_resizable, v_resizable, resizable_panel, ResizableState}ドラッグ可能な分割ペイン
ResizeHandleresizable::{resize_handle, HandleEdge}単独のサイズ変更用エッジ
Scrollbarscroll::Scrollbarカスタムスクロールバー
データ表示
コンポーネントインポート備考
DataTabletable::{DataTable, TableState, TableDelegate}状態を保持します。多機能なテーブル
Diffdiff::{Diff, DiffState, DiffFile}状態を保持する RenderOnce 要素です。1 つ以上のファイル、マージコンフリクト、ソースファイルの読み取り専用の統合/Git 差分表示で、パッチはアプリケーションが提供します
Tabletable::{Table, ...}シンプルなテーブル
VirtualList{v_virtual_list, h_virtual_list}大規模なリスト向けの高性能表示
Listlist::{List, ListState, ListDelegate}状態を保持します。検索可能なリスト
Treetree::{Tree, TreeState, TreeItem, TreeEntry}状態を保持します。階層構造
DescriptionListdescription_list::DescriptionListキーと値のペア
Settingssetting::Settings設定パネル
チャットとメッセージング
コンポーネントインポート備考
Messagemessage::{Message, MessageContent, MessageAlignment}状態を保持しません。チャットメッセージの行
Bubblebubble::{Bubble, BubbleContent, BubbleVariant}状態を保持しません。メッセージバブル
Attachmentattachment::{Attachment, AttachmentContent, ...}状態を保持しません。ファイル/メディアの添付カード
MessageScrollermessage_scroller::{MessageScroller, MessageScrollerState}状態を保持します。自動スクロールするメッセージリスト
チャート
コンポーネントインポート備考
Chartchart::{AreaChart, BarChart, LineChart, PieChart, RadarChart}棒グラフ、折れ線グラフ、面グラフ、円グラフ
Plotplot::Plotデータには #[derive(IntoPlot)] を使用します

テスト

UI 統合テストとは、ヘッドレスウィンドウで実際のコンポーネントをレンダリングし、 入力をシミュレートして、状態、フォーカス、レイアウト、オーナーのコールバックを確認することです。テストの実行には #[gpui_kit::test] を、UI の操作と検査には gpui_kit::test を使用します。 コンポーネントの操作テストを追加するよう求められた場合は、UI 統合テストとして説明してください。

ユニットテスト、GPUI コンテキストテスト、UI 統合テストについては、 テストを参照してください。依存関係のセットアップ、実行可能な完全な UI フロー、 スコープ付きネイティブ操作、フレームと非同期処理の扱い、アクセシビリティとジオメトリに関するアサーションの制限が含まれています。本番環境のビューを使用し、 通常の Rust アサーションでアクションの結果を検証してください。

GPUI リファレンス

タスクで扱う仕組みに対応するファイルを読み込んでください。各ファイルは目次の行から始まります。

トピックファイル読み込むタイミング
アクションとキーバインドaction.mdactions!、bind_keys、on_action、key_context を使う場合
非同期処理とバックグラウンドタスクasync.mdcx.spawn、background_spawn、Task、非同期 I/O を使う場合
コンテキスト管理context.mdApp、Window、Context<T>、AsyncApp を使う場合
カスタム要素(低レベル)element.mdElement トレイト、request_layout、prepaint、paint を使う場合
エンティティの状態entity.mdEntity<T>、WeakEntity、状態管理を使う場合
イベントとサブスクリプションevent.mdcx.emit、cx.subscribe、cx.observe を使う場合
フォーカスとキーボード操作focus-handle.mdFocusHandle、track_focus、Tab キーによる移動を使う場合
グローバル状態global.mdGlobal トレイト、cx.set_global、アプリ全体の設定を使う場合
レイアウトとスタイルlayout-style.mddiv()、h_flex()、v_flex()、フレックスボックス、オーバーフロー、配置を使う場合
ElementIdelement-id.mdElementId、.id()、一意性のルール、状態を持つ要素を使う場合
テストtest.md#[gpui_kit::test]、TestAppContext、VisualTestContext を使う場合

トピックのファイルだけでは不十分な場合は、詳しい解説を参照してください。

コメント