Icon
Lucide IconsとFontAwesome/Heroiconsをラップした統一アイコンコンポーネント
インポート
import { Icon } from '@caroainc/ui-components'基本的な使い方
<Icon name="Search" />
<Icon name="User" />
<Icon name="Settings" />アイコンの種類
Caroa UIのIconコンポーネントは3種類のアイコンをサポートしています:
| 種類 | ソース | 例 |
|---|---|---|
| Lucide | Lucide Icons | Search, User, Settings, Home |
| カスタム(variant対応) | FontAwesome 6 | Heart, Star, Bookmark, Bell |
| ブランド | FontAwesome 6 | Facebook, Twitter, Discord |
サイズ
<Icon name="Star" size="xs" /> // 12px
<Icon name="Star" size="sm" /> // 16px
<Icon name="Star" size="md" /> // 20px(デフォルト)
<Icon name="Star" size="lg" /> // 24px
<Icon name="Star" size="xl" /> // 32px
<Icon name="Star" size="2xl" /> // 40pxバリアント(outline / filled)
一部のアイコンは variant propで表示を切り替えられます。
<Icon name="Heart" variant="outline" /> // アウトライン(デフォルト)
<Icon name="Heart" variant="filled" /> // 塗りつぶしvariant対応アイコン一覧
線の太さ(Lucideアイコン専用)
Lucideアイコンは weight propで線の太さを調整できます。
<Icon name="Search" weight="thin" />
<Icon name="Search" weight="light" />
<Icon name="Search" weight="regular" /> // デフォルト
<Icon name="Search" weight="bold" />weight はLucideアイコン専用です。カスタムアイコン(FontAwesome系)では効果がありません。
TypeScriptで型エラーが表示されます。
ブランドアイコン
SNSやサービスのブランドアイコンを使用できます。
<Icon name="Facebook" />
<Icon name="Instagram" />
<Icon name="TwitterX" />
<Icon name="Youtube" />
<Icon name="Discord" />
<Icon name="Slack" />
<Icon name="Line" />
<Icon name="TikTok" />利用可能なブランドアイコン
| アイコン名 | 説明 |
|---|---|
Facebook | |
Instagram | |
TwitterX | X (旧Twitter) |
Youtube | YouTube |
Discord | Discord |
Slack | Slack |
Line | LINE |
TikTok | TikTok |
Threads | Threads |
Spotify | Spotify |
Google | |
Figma | Figma |
Chrome | Google Chrome |
Codepen | CodePen |
Codesandbox | CodeSandbox |
Dribbble | Dribbble |
Framer | Framer |
Github | GitHub |
Gitlab | GitLab |
Linkedin | |
Pocket | |
Trello | Trello |
Twitter | X(旧Twitter。TwitterXと同じ見た目。新規実装ではTwitterXを推奨) |
Twitch | Twitch |
ブランドアイコンは variant や weight を指定できません。
TypeScriptで型エラーが表示されます。
旧lucideアイコン名のエイリアス
lucide-react upstreamでリネーム・削除された一部のアイコン名は、後方互換のため引き続き<Icon name="旧名">で使用できます。内部的にはLucide解決パス(通常のstroke描画)を通るため、カスタムアイコン(塗りつぶし)扱いにはなりません。
| 旧アイコン名 | 解決先 | 経緯 |
|---|---|---|
MousePointerSquare | SquareMousePointer | upstreamでのリネーム(2024-03、GitHub PR#1906) |
RailSymbol | TrainTrack(近似後継) | upstreamでicon.brand理由により非推奨化・v1.0で完全削除。リネームではなく撤去のため公式の後継名はなく、意味的に最も近いアイコンをエイリアス先とした |
いずれも新規実装では解決先の現行アイコン名(SquareMousePointer / TrainTrack)を使うことを推奨します。
カスタムクラス
<Icon name="Heart" className="text-red-500" />
<Icon name="Check" className="text-green-500" />
<Icon name="Loader2" className="animate-spin" />未知のアイコン名(開発時の警告)
一覧に無いアイコン名を渡すと、開発モード(NODE_ENV !== 'production')限定で HelpCircle にフォールバックしつつ console.warn で警告します。本番ビルドでは警告は出ません(フォールバック表示のみ)。
<Icon name="NotARealIconName" />
// console.warn: [Caroa UI] Icon: 未知のアイコン名 "NotARealIconName" が指定されました。HelpCircleにフォールバックします。エスケープハッチ(component)
Lucide/カスタムアイコン一覧に無いアイコン(サードパーティ製・独自SVG等)を一時的に使いたい場合は、name の代わりに component で任意のアイコンコンポーネントを直接渡せます。name と component は同時に指定できません(型エラーになります)。
import { SomeThirdPartyIcon } from 'some-icon-library'
// nameの代わりにcomponentを渡す。size/classNameはIconが自動で伝搬する
<Icon component={SomeThirdPartyIcon} size="lg" />
// 独自SVGをラップする場合は size prop を受け取れる形にする
function MyIcon({ size, className }: { size?: number | string; className?: string }) {
return (
<svg width={size} height={size} className={className} viewBox="0 0 24 24" fill="none" stroke="currentColor">
<circle cx="12" cy="12" r="10" />
</svg>
)
}
<Icon component={MyIcon} size="lg" />恒久的に使うアイコンは component エスケープハッチではなく、Lucideなら src/components/Icon/lucide-icons.ts、ブランド等のカスタムアイコンなら src/components/Icon/custom-icons.ts に正規登録することを推奨します(name で一元管理でき、weight/variant 等の機能もフルに使えます)。
Props対応表
各propsがアイコンの種類によって有効かどうかを示します。
| Props | Lucide | カスタム(variant対応) | ブランド |
|---|---|---|---|
name | ✅ | ✅ | ✅ |
size | ✅ | ✅ | ✅ |
className | ✅ | ✅ | ✅ |
weight | ✅ | ❌ 型エラー | ❌ 型エラー |
variant | ✅ | ✅ | ❌ 型エラー |
Props
| Prop | Type | Default | Description |
|---|---|---|---|
name | IconName | - | アイコン名。Lucide、カスタム、ブランドアイコンから選択(componentと同時指定不可)。componentエスケープハッチを使う場合は不要(nameかcomponentのいずれか一方が必須) |
component | React.ComponentType | - | nameの代わりに任意のアイコンコンポーネントを直接渡すエスケープハッチ(nameと同時指定不可)。nameかcomponentのいずれか一方が必須 |
size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' | アイコンサイズ(12px〜40px) |
weight | 'thin' | 'light' | 'regular' | 'bold' | 'regular' | 線の太さ(Lucideアイコン専用) |
variant | 'outline' | 'filled' | 'outline' | アウトラインまたは塗りつぶし(Lucide、カスタムアイコン) |
className | string | - | 追加のCSSクラス |
よく使うLucideアイコン
全てのLucideアイコンは lucide.dev/icons で確認できます。