Skip to content

Instantly share code, notes, and snippets.

@lightsound
Last active July 22, 2022 09:54
Show Gist options
  • Save lightsound/0fffd0a85af4603dfefcc5feea0cdde5 to your computer and use it in GitHub Desktop.
Save lightsound/0fffd0a85af4603dfefcc5feea0cdde5 to your computer and use it in GitHub Desktop.
React Spectrumの講座用

React Spectrum

モチベーション

デザインシステム間の主な違いは、スタイリング。それ以外は共通の部分が多いのに各社イチから自分で実装していて大変。特にアクセシビリティ、国際化、キーボード、マウス、タッチインタラクション対応などは難しい。そこを何とかするのが React Spectrum。

基礎

React Spectrum ではコンポーネントを次の 3 つに分類する。

  1. State Hooks
    • インタラクティブなコンポーネントの状態を提供する
    • View を一切考慮しない = DOM や React Native に依存しない
    • テーマやデザインシステム固有のロジックも持たない
    • React Stately の領域
  2. Behavior Hooks
    • イベント処理、アクセシビリティ、国際化などを提供する
    • プラットフォームの API(DOM や React Native)に依存する
    • テーマやデザインシステム固有のロジックも持たない
    • 主に React AriaInternationalized の領域
  3. Component
    • State と Behavior を用いて View を実装する
    • Spectrum CSSSpectrum Design が関係?

これら 3 つの要素を用いて作られたコンポーネントライブラリが React Spectrum

この時点での所感

ただコンポーネントライブラリとして使いたい人は React Spectrum で良さそう。もしライブラリとしての React Spectrum に欲しい物が無い場合は、React Stately や React Aria を用いて自作する感じな気がする。

また会社でデザインシステムを作っている場合は、React Stately や React Aria などを使用することにより工数削減(脱車輪の再発明)できそう。

コンポーネント以外

Getting Started を読んでみて...

「唯一の要件は、CSS の import」と書かれてあるが Next.js と使いにくそうで残念。素の React なら問題ないそう。TypeScript 対応はさすが。

Layout を読んでみて...

  • レイアウトは基本的に Flex や Grid  で一般的なライブラリと大差なし
  • Flex や Grid はオブジェクトのシンタックスをサポート。下記のような記述でレスポンシブ対応が行える。
<Flex direction={{base: 'row', L: 'column'}} />
  • いくつかのコンポーネントは Slots の概念を利用し、コンポーネントを組み合わせて作る必要がある。Dialog, Picker, Menu などなど

Styling を読んでみて...

  • Spectrum のデザインカスタマイズは推奨されない。ただしほとんどのコンポーネントは微調整可能。
  • 内部コンポーネントスタイルはオーバーライド不可。コンポーネントが持つスタイリング系の props でなんとかするしか無い。
  • スタイルプロパティは Spectrum の変数を使用するのがオススメ。自動的にデバイスなどの最適化を行ってくれる
  • Spectrum に存在しないコンポーネントを構築する場合も Spectrum 変数を使うべき。例えば、色、枠のサイズ、パディングなどに統一性が出る。
  • Spectrum カラーはダークモードに自動適応
  • React Spectrum では className と style はサポートしないが、エスケープハッチとして UNSAFE_className と UNSAFE_style がある

Server Side Rendering を読んでみて...

  • やはり Next.js との使用にはカオスな設定が必要

Provider を読んでみて...

  • Theme や Color Scheme, Locales, Breakpoints などを変更できる
  • 配下のコンポーネントに一括で props を定義できる
    • 例が秀逸

コンポーネント

全体的に高機能でめっちゃ使いやすい。

  • ListView めっちゃ便利
  • DatePicker 系良い。Range に Time もある!!
  • Tabs の Collapse 良い!
  • IllustratedMessage おもしろい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment