メインコンテンツへスキップ
menumenu tanreiexpand_morecontrasttranslate
tanreiexpand_more
はじめにWebReactSwiftUIJetpack ComposeFlutterReact Nativeプリセット自分のデザインシステムを作るAI エージェントと Tanrei を使うブランドデザイントークンデザインシステムとカスタマイズTheme Studioカラータイポグラフィアイコン形状エレベーションモーションインタラクション状態振る舞いレイアウトアクセシビリティ言葉カラートークンタイプスケールトークン形状トークンエレベーショントークンモーショントークン状態トークンスペースと寸法のトークンコンポーネントボタンメインアクションボタンセグメントボタンボタングループメニュー付きボタンツールバーコピーボタンチェックボックスラジオボタンスイッチチップメニュースライダースライダーフィールドカレンダーDateTimePickerフィールドグループラジオグループチェックボックスグループセレクトセレクトフィールドメニューバーファイルアップロードファイルピッカー 上級者向けドロップゾーンテキスト入力欄 上級者向けテキストフィールドチップフィールドフィールドコンボボックス 上級者向けコンボボックスフィールド数値入力欄 上級者向け数値フィールドカラー入力欄 上級者向けカラーフィールドワンタイムコード入力欄 上級者向けワンタイムコードフィールド埋め込みテキスト入力欄 上級者向けチャットコンポーザーカード区切り線モーダルレイヤー 上級者向けダイアログリストリスト行ボトムシートサイドシートカルーセルコードブロックテーブルポップオーバーステップアコーディオン説明リスト図アプリシェルページヘッダーツリービュータイムライン画像プレビューハンドルサイズ変更できる枠スクロールエリアバッジプログレスインジケーターメーターナンバーティッカーローディングインジケータースナックバーツールチップキーボードショートカットタグインラインコードコールアウトアバター空の状態タググループスケルトンファイル項目色見本マーキーテキストタブタブビューアプリバーナビゲーションバーナビゲーションドロワー検索リンクページネーション前後のリンクステッパーパンくずリスト目次リンクカードFAB メニューステータスTanrei の作り方コントリビューションライセンスと帰属
ホーム基礎アイコン

アイコン

アイコンセットはデザインシステムごとに 1 つ、太さも 1 つ、規則も 1 つ。未選択は線、選択中は塗り。

content_copyMarkdown で表示

Tanrei の既定のアイコンは Material Symbols の Rounded、太さ 300 です。文字用の書体と同じく、フォントは名前で参照するだけで同梱しません。読み込むのはプロダクトの役目です。

アイコンの描き方は、少数のトークンで決まります。アイコンの枠は sys.icon.small・medium・large の 3 サイズ(既定では 16・20・24px)で、フォントのオプティカルサイズは枠の大きさに追従します。

ref.typeface.icon
The icon font. Material Symbols Rounded: a variable font whose weight and fill are set from sys.icon.
sys.icon.family
The icon font by selection. A variable icon font (Material Symbols) is one family and tells selected from unselected with its FILL axis; a static icon font tells them apart with two families (Material Icons Outlined / Material Icons). Both default to ref.typeface.icon.
sys.icon.weight
The stroke weight of every icon (the `wght` axis of the icon font).
sys.icon.fill
The fill of an icon by selection (the `FILL` axis of the icon font): 0 is outlined, 1 is filled.

生成元 tokens/ref/typeface.tokens.json, tokens/sys/measure.tokens.json

塗りの規則

未選択は線。選択中は塗り。例外はありません。 ナビゲーション項目、タブ、トグル、チップ、お気に入り。どれもグリフは同じまま、状態に応じて塗りだけが変わります。装飾のために線と塗りを混ぜることはなく、塗りを手で選ぶこともありません。Web では、アイコンが置かれたコントロールの状態に塗りが自動で追従します。

塗りは選択状態に追従する

追加
import '@tanrei/web/icons.css';
<button aria-pressed="true"><span class="tanrei-icon" aria-hidden="true">favorite</span> お気に入り</button>

.tanrei-icon は、祖先要素の aria-pressed・aria-selected・aria-checked・aria-current(これらを data-aria-* に移す Tanrei のコントロールでは data-aria-pressed・data-aria-selected・data-aria-checked・data-aria-current)、またはアイコン自身か祖先の data-selected を読み取ります(data-selected="false" を付けると、そのアイコンだけ対象から外せます)。隣のテキストが同じ内容を伝えているならアイコンに aria-hidden="true" を付け、そうでないならコントロールにアクセシブルネームを付けてください。

名前は data-icon で渡すこともできます。その場合、要素の中身は空にします。

<span class="tanrei-icon" data-icon="folder"></span>

描かれるグリフは同じですが、名前がページのテキストになりません。textContent や innerText にも、コピーした文字列にも、周りのコントロールのアクセシブルネームにも入りません。メニューやリストの行、表のセル、テストで文字列を比べる箇所など、名前がテキストとして読まれてしまう場所で使ってください。サイズ、選択状態、右から左のレイアウトでの反転は、テキストで書いた場合とまったく同じように働きます。隣のテキストが同じ内容を伝えている場合は、この形でも aria-hidden="true" を付けてください。Firefox 127 以前は、この名前をアクセシブルネームに含めて読み上げます。

ネイティブの各プラットフォームでは、同じ値がデザインシステムと一緒に届きます(system.icon)。あわせて、「選択中かどうか」とサイズから、フォントに渡す設定を返す小さなヘルパーがあります。アイコンコンポーネントはまだ提供していません。

デザインシステムごとのアイコンセット

アイコンセットはデザインシステムに属するものなので、レイヤで変えられます。同梱システムでの解決値は次のとおりです。

デザインシステム family.unselected family.selected weight fill.unselected fill.selected
tanrei Material Symbols Rounded Material Symbols Rounded 300 0 1
cupertino Material Symbols Rounded Material Symbols Rounded 300 0 1
m3-expressive-like Material Symbols Outlined Material Symbols Outlined 400 0 1
m3-like Material Symbols Outlined Material Symbols Outlined 400 0 1

生成元 tokens/systems/*.system.json, design/tokens/<system>/tanrei.light.tokens.json

アイコンフォントが選択中と未選択を描き分ける方法は 2 通りあり、トークンはその両方に対応しています。選択中のアイコンには、常に family.selected と fill.selected の両方が適用されます。実際に見た目を変えるのがどちらになるかは、セット次第です。

バリアブルフォント 1 ファミリー

Material Symbols のようなバリアブルのアイコンフォントは、FILL 軸を持つ 1 つのファミリーです。ファミリーのトークンは既定でどちらも ref.typeface.icon を指しているので、このトークン 1 つを差し替えればセットが変わり、状態の描き分けは fill.unselected / fill.selected が受け持ちます。m3-like が書いているのはこれだけです。

"tokens": {
  "tanrei.ref.typeface.icon": { "$value": ["Material Symbols Outlined"], "reason": "Material Design 3 draws Material Symbols in the Outlined style." },
  "tanrei.sys.icon.weight":   { "$value": 400, "reason": "Material Symbols default weight in Material Design 3." }
}

スタティックフォント 2 ファミリー

スタティックなアイコンフォントには軸がありません。線の絵と塗りの絵が別々のファミリーとして配布されているので、レイヤでは状態ごとにファミリーを指定します。

"tokens": {
  "tanrei.sys.icon.family.unselected": { "$value": ["Material Icons Outlined"], "reason": "Acme uses the static Material Icons set: outlined when unselected." },
  "tanrei.sys.icon.family.selected":   { "$value": ["Material Icons"], "reason": "Acme uses the static Material Icons set: filled when selected." },
  "tanrei.sys.icon.weight":            { "$value": 400, "reason": "A static icon font has one weight; 400 is what Material Icons is drawn at." }
}

塗りと太さのトークンはそのままで構いません。スタティックフォントは軸を無視するので害はなく、コンポーネントはどちらの種類のセットが有効かを知る必要がありません。このレイヤは、リポジトリ自身のテスト用フィクスチャ(packages/tokens-build/test/fixtures/acme.system.json)です。

アイコンの名前はプロダクトが決める

Tanrei が決めるのはアイコンの「描き方」であって、「どのアイコンがあるか」ではありません。グリフの名前はセットごとに違い、あるセットにあるグリフが別のセットに無いこともあります。アイコンセットを変えるプロダクトは、自分が使っている名前を確認してください。なお、SF Symbols のようにフォントではないシンボルセットは、ファミリーのトークンでは指定できません。これは mimicry-gaps 台帳に platform-symbol-sets として登録しています。

React Native

React Native の <Text> はフォントのバリエーション軸を設定できません。そのためバリアブルのアイコンフォントでは FILL がグリフに届かず、アイコンはどちらの状態でも同じ見た目になります。React Native で塗りの規則を守るには、上のようにスタティックフォント 2 ファミリーを使うか、アイコンを SVG で描いてください。

ネイティブ 4 パッケージのアイコンヘルパーは、いま「状態ごとのファミリー」モデルへ移行しているところです。各パッケージの README にその記載が載るまでは、そのパッケージは単一のファミリーを読むものと考えてください。