sashigane
コンポーネント

Icon

アイコンを1つ置く。大きさは決まった候補から選ぶ

アイコンは lucide のものです

lucide のアイコンを使います。実行時の依存を持たず、必要なものだけがバンドルに含まれます。

このシステムが持つのはサイズ・読み上げの既定・data-sg-component の付与だけです。 アイコンそのものは lucide のものです。

lucide-react は一緒にインストールされます

Icon を追加すると lucide-react も一緒にインストールされます。自分で入れる必要はありません。

ただしここに無いアイコンを足すときは、利用側が lucide-react から import します—— アイコンそのものは lucide のものだからです。

ここに無いアイコンは、同じ形で足せます

包む形を公開しています。全部を持たない代わりに、足す道を配ります。

import { Search } from 'lucide-react';
import { defineIcon } from '@sashigane/ui';

export const IconSearch = defineIcon(Search);

props は lucide のものをそのまま引き継ぎます。

data-sg-component の値はアイコンの名前から導きます。 Search なら icon-search、 ChevronDown なら icon-chevron-down です。手で書きません—— 書くと2箇所に同じことが並び、片方だけ直したときに静かにずれます。

既定は読み上げから隠れます

アイコンはたいてい文字の隣にあり、同じことを言っています。 隠さないと二重に読まれます。

名前を渡したときだけ隠れません。

<IconX />                    {/* 飾り。読み上げに出ません */}
<IconX aria-label="閉じる" /> {/* アイコンだけで意味を伝える場所 */}

大きさは段で選びます

段使うところ
smラベルや表の行の中
md(既定)文字やボタンと並べるとき。行の高さと同じ

className で大きさは上書きできません。 同じ次元を上書きしたとき、 どちらが効くかをこのシステムは保証していないためです—— 実際 size-4 を渡しても既定に負けます。段にすれば、負ける形が生まれません。

size は通していません

lucide は width / height の属性で書きますが、こちらはクラスで書きます。 CSS は属性に勝つので、size を渡しても何も起きないまま消えます。

3つの状態

通常・空・エッジケースの3つは、どのコンポーネントにも必ずあります。

通常default.tsx

通常。アイコンは lucide から来る。

文字と並べる

空empty.tsx

空。中身を持たない。

エッジケースedge.tsx

エッジケース。名前を与えたときと、塗りの上に置いたとき。

← 名前を渡すと読み上げに出ます

props

Prop

Type

型と説明はコンポーネントのソースから抽出しています。既定値は出していません——cva の defaultVariants は 署名に現れないので、表に出すと「引数のデフォルトが書かれているものだけ」になり、嘘になります。

On this page