base-ui について
Base UI は、スタイルなしで組み合わせ可能なプリミティブを使い、アクセシブルな UI を構築する React コンポーネントライブラリと関連スキルです。コンポーネントの組み立てや render プロップによる合成、アクセシビリティ対応を案内し、見た目のスタイルはアプリ側で設定します。
主な機能
- 01スタイルなしで組み合わせ可能な React プリミティブ
- 02複数パーツで構成するコンポーネント
- 03render プロップによる要素のカスタマイズ
- 04状態に応じたスタイリング属性
- 05アクセシブルなフォームとオーバーレイのガイド
活用シーン
- 01ラベルと検証を備えたフォームの構築
- 02メニュー、ポップアップ、オーバーレイの合成
- 03公開された状態に応じたコンポーネントのスタイリング
- 04RTL と厳格な CSP 要件への対応
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itechmeat/ llm-code --skill base-uiインストール後、Claude Code で/base-uiを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/csp-provider.mddirection-provider.mddrawer.mdfieldset.mdform.mdinput.mdmenu.mdmenubar.mdmerge-props.mdmeter.mdnavigation-menu.mdnumber-field.mdotp-field.mdpopover.mdpreview-card.mdprogress.mdradio.mdscroll-area.mdselect.mdseparator.mdslider.mdswitch.mdtabs.mdtoast.mdtoggle-group.mdtoggle.mdtoolbar.mdtooltip.mduse-render.md詳細
Base UI(React)
Base UI は、スタイルの設定されていない、組み合わせ可能な React コンポーネントを提供します。このスキルでは、複数パーツで構成されるコンポーネントの組み立て、render prop を使った合成、スタイルを設定する際のアクセシビリティ要件への対応に重点を置いています。
クイックナビゲーション(リファレンス)
ユーティリティ
- references/csp-provider.md
- references/direction-provider.md
- references/merge-props.md
- references/use-render.md
フォームと入力
- references/form.md
- references/fieldset.md
- references/input.md
- references/number-field.md
- references/otp-field.md
- references/radio.md
- references/select.md
- references/slider.md
- references/switch.md
フィードバックとステータス
- references/meter.md
- references/progress.md
- references/toast.md
メニュー、ナビゲーション、オーバーレイ
- references/drawer.md
- references/menu.md
- references/menubar.md
- references/navigation-menu.md
- references/popover.md
- references/preview-card.md
- references/tooltip.md
トグルとコントロール
- references/toggle.md
- references/toggle-group.md
- references/toolbar.md
レイアウトと区切り
- references/scroll-area.md
- references/separator.md
v1.7.0 - v1.8.0 の主な変更点
Comboboxに、オプションコレクションをプログラムで構築するためのcreateItemsコレクション API が追加されました。Avatar.ImageにkeepMountedprop が追加され、画像サブツリーをマウントしたままにできるようになりました(再マウント時のちらつき防止に役立ちます)。Toastで現在のトーストから導出する関数による更新が可能になり、Toast.Title、Toast.Description、Toast.Actionでもrenderprop が有効になりました。AutocompleteとComboboxがinput-pressおよびcancel-openの変更イベント詳細を発行するようになり、インラインComboboxではexpanded状態が公開されます。Combobox.ItemとSelect.Itemは、ルートから無効状態を継承するようになりました。Formはドキュメント上の順序で最初の無効なフィールドにフォーカスし、Fieldは非同期バリデーション中に中立的な有効性を公開します。- ドロワー、メニュー、ツールチップ、スクロール領域全体で、主にアクセシビリティ、ポップアップ/オーバーレイの動作、バンドルサイズが改善されました。
v1.4.1 の主な変更点
mergePropsが複数引数を取るイベントハンドラーを正しく転送するようになりました。これは、イベントとともに追加の詳細情報や状態を受け取るラップ済みコールバックで重要です。display: contentsを使ったタブ移動可能性が修正されました。DOM 構造をフラット化するカスタムラッパーや render prop の合成を再テストしてください。- トリガーをすばやくホバーした際のポップアップサイズが修正され、スクロールコンテナー内でクリップされた項目のハイライト解除がより確実になりました。
v1.6.0 の主な変更点
OTPFieldPreview名前空間がOTPFieldに改名されました。プレビュー名前空間を参照していたインポートを更新してください。- Accordion、Alert Dialog、Autocomplete、Avatar、Checkbox、Dialog、Drawer、Field、Menu、Number Field、OTP Field など、幅広いコンポーネントの動作上のバグが修正されました。
v1.5.0 の主な変更点
OTPFieldではsanitizeValue()がnormalizeValue()に置き換えられ、キーボードショートカットとバリデーション合成の動作が改善されました。- ポップアップベースのコンポーネントが、制御された
open状態をより一貫して尊重するようになりました。これはPopover、Menu、PreviewCardおよび関連するオーバーレイに影響します。 Form、Field、OTPFieldでは、以前のflushSyncスタイルのバリデーションタイミングパターンを使用しなくなりました。ローカルのバリデーションスケジュールに関する回避策を残す前に、再テストしてください。NavigationMenu、Popover、ScrollArea全体で RTL の動作が修正されました。Drawer.Viewportがstyleを転送するようになりました。カスタムのビューポートサイズ設定やアニメーション付きレイアウトの制約に役立ちます。
v1.4.0 の主な変更点
- ワンタイムパスワードや確認コードの入力に使えるプレビュー用プリミティブとして、
OTPFieldが追加されました。 - 非表示の入力で
formとsuppressHydrationWarningが公開されるようになりました。外部フォームにコントロールを送信する場合や、SSR 境界をまたいでハイドレーションする場合に重要です。 - 合成されたコンポーネントで、
renderの警告とpreventBaseUIHandler()の実行時の動作がより安定しました。 Drawer、NavigationMenu、Select、Slider、Toast、Switchのオーバーレイ/入力プリミティブに重要な動作修正が行われました。
v1.3.0 の主な変更点
- Drawer が安定版になりました(プレビューではなくなりました)。主要なオーバーレイプリミティブとして扱ってください。
- Autocomplete と Combobox に
InputGroupが追加されました。Combobox、Select、Slider にはLabelパーツが追加されました。 - Drawer に、明示的なスワイプ操作を可能にする
SwipeAreaが追加されました。 - Tooltip に
closeOnClickが追加されました。Toast ではすべてのトーストを閉じられます。 - Checkbox、Radio Group、Switch で、
aria-labelledbyの自動サポートが改善されました。 - v1.2.0 で追加された
renderプロパティのサポートは引き続き利用できます。遅延要素も対象です。
適用する基本概念
- スタイルなしプリミティブ:すべてのビジュアルは CSS/Tailwind/CSS Modules で設定します。Base UI は動作とアクセシビリティを担います。
- 複数パーツの構成:ほとんどのコンポーネントは
Rootとサブパーツ(Trigger、Popup、Itemなど)で構成されます。これらを明示的に組み合わせてください。 renderプロパティ:デフォルト要素を置き換えたり、独自のコンポーネントでラップしたりできます。関数形式を使う場合は、mergePropsでプロパティを手動でマージしてください。- 状態に応じたスタイリング:多くのパーツでは、
data-[popup-open]、data-[highlighted]、data-[pressed]、data-[checked]、data-[invalid]などのデータ属性が公開されています。 - オーバーレイにはポータルを使用:ポップオーバー、メニュー、ツールチップ、セレクト、ナビゲーションメニューのコンテンツ、プレビューカードには、
Portal+Positioner+Popupを使用してください。
レシピ
1)アクセシブルなフォームをすばやく作成する
Formで入力をラップし、送信とエラーの集約を行います。nameを指定したField.Rootを使用し、ラベルとエラーにはField.Label、Field.Control、Field.Errorを使います。- 関連するフィールドを
Fieldset.Root+Fieldset.Legendでグループ化します。 Radioグループには、aria-labelledbyを指定してRadioGroupを使うか、Fieldset.Root経由でRadioGroupをレンダリングし、各選択肢にField.Labelを使います。- すべてのフォームコントロールに、アクセシブルな名前(ラベル、または
Field/Fieldsetのラベル付けパターン)を設定してください。
2)render + mergeProps で組み合わせる
renderに React 要素を渡すと、Base UI がプロパティを自動でマージします。renderに関数を渡す場合は、Base UI のプロパティと独自のプロパティをmergePropsでマージしてください。- 必要に応じて Base UI の内部動作を止めるには、マージしたイベントハンドラー内で
event.preventBaseUIHandler()を使います(合成イベントのみ)。
3)オーバーレイとメニュー(ポータル化された UI)
Root+Trigger+Portal+Positioner+Popupを使ってポップアップを構築します。- メニューやナビゲーションには、必要に応じて
Item、Separator、Arrow、リスト/ビューポートのパーツを追加します。 NavigationMenu.Linkは、フレームワークのルーターリンク向けにrenderをサポートしています。
4)トースト
- アプリ全体(またはサブツリー)を
Toast.Providerでラップします。 Toast.useToastManager()を使ってトーストを作成します。Toast.Portal内にToast.Viewportをレンダリングし、toastsをToast.Rootの項目にマッピングして、Toast.Content、Toast.Title、Toast.Description、Toast.Closeを配置します。
5)RTL と CSP の制約
- RTL の動作には
DirectionProviderでラップし、dir="rtl"も設定します(プロバイダーは DOM の方向を設定しません)。 - 厳格な CSP では、
CSPProviderでラップしてnonceを渡すか、アプリ側で外部スタイルを用意する場合はインラインの style 要素を無効にします。インラインの style 属性はCSPProviderで制御されないため注意してください。
6)スライダーと範囲
- 単一値のスライダー:
Slider.Thumbを 1 つ使います。 - 範囲スライダー:配列を渡し、値ごとに
Slider.Thumbをレンダリングします。SSR の位置合わせにはindexを追加します。 - 端での位置合わせが必要な場合は、
thumbAlignmentでサムの位置を調整します。
重要な禁止事項
- 入力、スライダー、スイッチ、ラジオグループにアクセシブルなラベルを付け忘れないでください。
- Base UI がデフォルトのスタイルを提供すると期待しないでください。独自のスタイルを適用してください。
- スタッキングやオーバーフローのコンテキストから抜け出す必要があるオーバーレイでは、
Portalを忘れないでください。 renderの関数形式を使う場合、mergePropsを省略しないでください。
出力に関する要件
ユーザーへの回答には、以下を含めてください。
- 使用する具体的な Base UI コンポーネントと主要なパーツ。
- 簡潔な組み立て手順(必要に応じて Root + パーツ + ポータル/ポジショナー)。
- アクセシビリティと状態に応じたスタイリングの短いチェックリスト。
Links
コメント
Markdown 対応