Chakra UIの役割
- スタイルつきのコンポーネント集
- かなり豊富なコンポーネント群
- Modalの表示を制御する hooks などもある
- CSS in JSライブラリ
- styled-system を内包している
裏側の実装
- emotion とstyled-system を組み合わせている
- styled-system: スタイル計算
- emotion: className 生成
React Server Componentに対応できるのか気になり
設計原則
- Style Props
- すべてのコンポーネントは
style
propsで上書き可能になっていて、css
props やstyled()
の使用を減らす設計になっている - Chakra UI のコンポーネントはすべて上記の特性をもつ
<Box>
を使っている
- Simplicity
- コンポーネントのAPIをかなりシンプルに保つよう設計している
- Composition
- 複雑さを抑えるためにコンポーネントはなるべく小さく分割している
- これにより、スタイルや機能の柔軟性・拡張性を確保している
- Accessibility
- コンポーネントを作成する際、a11y を最優先に考えている
- キーボードナビゲーション、フォーカス管理、カラーコントラスト、ボイスオーバー、適切な
aria-
属性
- Dark Mode
- ダークモードを考慮している
- Naming Props
- 命名規則は
does
,has
,is
,should
のような補助動詞を使うようになっている
他ライブラリとの比較
Tailwind CSSとの違い
- 学習コスト
- Tailwind: BootstrapやBulma CSSを使ったことがあればTailwindの学習は楽だが、styled-component, emotionなどを使っている場合、かなり厳しい学習曲線になるかもしれない
- Chakra UI: 非常に直感的で、CSSライク、かつ props ベースのスタイリングモデルが付属しており、習得が容易。コンポーネント名やprops名も非常にわかりやすくなっている。
- レスポンシブスタイル
- Tailwind: 記述が長くなる可能性がある
<img class="w-16 md:w-32 lg:w-48" src="...">
- Chakra UI: 非常に簡単かつ直感的な方法でレスポンシブスタイルをかける
<Img w={{ base: 16, md: 32, lg: 48 }} src="..." />
- スタイルの上書き
- Tailwind: CSSユーティリティフレームワークなので、特定のclassNameを上書きしたり、カスタムCSSを記述するための最適な方法を自分で見つける必要がある
- Chakra UI: Chakra UIスタイルはpropsベースなので、上書きはpropsを渡すのと同じくらい簡単
Theme UIとの違い
- Chakra UIはTheme UIにインスパイアされている
- Chakra UI は Theme UI よりも多くのコンポーネント、改良されたスタイリング API、アクセシビリティ、および直感的なコンポーネント API を提供している
- Chakra は、Theme UI をより堅牢にしたもので、styled-system の力をフルに活用して、より優れたコンポーネント・スタイルとテーマ性を提供するものと考えてください
Material UIとの違い
- Material UIが提供するものと同様のUIコンポーネントを開発者に提供するが、柔軟で合成可能、かつ拡張性のあるコードの作成に重点を置いている
- Material UI はスタイル、コンポーネントの上書き、特にレスポンシブデザインが絡むと特に大変
Ant Design との違い
- Ant Design: コンポーネントは既存の設計ルールや値に従いますが、特定の変数については限られた範囲でしかカスタマイズができない
- Chakra UI: デザインシステムに縛られることなく、より自由にコンポーネントをカスタマイズして、独自のデザインを実装することができる
- ex. Button コンポーネントのcolorSchemaで色変更ができるが、独自のカラー構成を追加することができるが、Ant Designはできない
[WIP] 各コンポーネント解説
Box
- 最もプリミティブなコンポーネント(
<div>
みたいなものだと思えばOK)
- 主な機能・ユースケース
- レスポンシブレイアウトの構築
- propsを介してスタイルを渡すための省略記法を提供する(ex. backgroundColorの代わりにbg)
as
props で<div>
以外のHTML要素に変身