shadcn-svelte について
shadcn-svelteは、Svelteプロジェクト向けのUIコンポーネントとデザインシステムを構築するフレームワークです。CLIでコンポーネントのソースをプロジェクトに追加でき、スタイルや構成、フォームの実装規則も示します。
主な機能
- 01CLIでコンポーネントのソースを追加
- 02既存コンポーネントを組み合わせて画面を構築
- 03セマンティックカラーとスタイル規則
- 04フォームとコンポーネント構成のパターン
- 05プロジェクト固有のエイリアスとアイコン設定
活用シーン
- 01Svelteプロジェクトでフォーム画面を構築
- 02ダッシュボードや設定画面を組み立てる
- 03プロジェクトのUIコンポーネントを追加・更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ huntabyte/ shadcn-svelte --skill shadcn-svelteインストール後、Claude Code で/shadcn-svelteを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
cli.mdcustomization.mdagents/openai.ymlevals/evals.jsonrules/composition.mdforms.mdicons.mdstyling.md詳細
shadcn-svelte
Svelte 向けの UI、コンポーネント、デザインシステムを構築するためのフレームワークです。コンポーネントは CLI を通じて、ユーザーのプロジェクトにソースとして追加されます。
IMPORTANT: CLI コマンドはすべて、プロジェクトのパッケージランナーを使用して実行してください。
npx shadcn-svelte@latest、pnpm dlx shadcn-svelte@latest、またはbunx --bun shadcn-svelte@latestのうち、プロジェクトのパッケージマネージャーに適したものを使用します。以下の例ではnpx shadcn-svelte@latestを使用していますが、プロジェクトに適したランナーに置き換えてください。
現在のプロジェクトコンテキスト
プロジェクトルートの components.json を読み、実際のファイル構成が必要な場合は、CLI と同じルールで解決した aliases.ui パスが示すディレクトリを一覧表示してください。
インポート(Svelte)
各コンポーネントは、index.ts のバレルファイルを含む独自のフォルダーにあります。インストール手順に従ってください。
- 複数パーツのコンポーネント(dialog、select、card、field、tabs など):
import * as Dialog from "$lib/components/ui/dialog"のようにインポートし、Dialog.Content、Dialog.Title、Card.Root、Card.Headerなど、バレルがエクスポートするものを使用します(短い名前やRoot as …のエイリアスなど)。 - 単一コンポーネントのバレル(フォルダー内に実質的なコンポーネントが 1 つだけある場合):名前付きインポートを使用します。
import { Button } from "$lib/components/ui/button"と<Button>のように記述し、import * as ButtonとButton.Rootの組み合わせは使用しません。{ Input }、{ Badge }、{ Spinner }、{ Checkbox }、{ Separator }、{ Skeleton }なども同じパターンです。
import * as Dialog from "$lib/components/ui/dialog";
import { Button } from "$lib/components/ui/button";
import { Separator } from "$lib/components/ui/separator";
ハードコードされたパスではなく、components.json に記載された実際のエイリアス(多くの場合 $lib/components/ui/...)を使用してください。
原則
- まず既存のコンポーネントを使用します。 引数なしで
npx shadcn-svelte@latest addを実行して利用可能なコンポーネントを確認するか、独自の UI を作成する前に コンポーネントを確認してください。 - 一から作るのではなく、組み合わせてください。 設定ページ=Tabs + Card + フォームコントロール。ダッシュボード=Sidebar + Card + Chart + Table。
- カスタムスタイルより先に、組み込みのバリアントを使用してください。
variant="outline"、size="sm"など。 - セマンティックカラーを使用してください。
bg-primary、text-muted-foregroundを使い、bg-blue-500のような生の値は使用しないでください。
重要なルール
これらのルールは常に適用されます。それぞれに、不正なコードと正しいコードの例を示すファイルへのリンクがあります。
スタイリングと Tailwind → styling.md
- レイアウトには
classを使い、スタイリングには使わないでください。 コンポーネントの色やタイポグラフィを上書きしないでください。 space-x-*やspace-y-*は使用しないでください。gap-*を指定したflexを使用します。縦方向のスタックにはflex flex-col gap-*を使用してください。- 幅と高さが等しい場合は
size-*を使用してください。w-10 h-10ではなくsize-10を使用します。 - 省略形の
truncateを使用してください。overflow-hidden text-ellipsis whitespace-nowrapは使用しないでください。 - 手動で
dark:の色を上書きしないでください。 セマンティックトークン(bg-background、text-muted-foreground)を使用します。 - 条件付きクラスには
cn()を使用してください。 手動のテンプレートリテラルによる三項演算子は使用しないでください。 - オーバーレイコンポーネントに手動で
z-indexを設定しないでください。 Dialog、Sheet、Popover などは、それぞれ独自に重なり順を処理します。
フォームと入力 → forms.md
- フォームでは
Field.FieldGroup+Field.Fieldを使用してください。 フォームのレイアウトにspace-y-*やgrid gap-*を指定した生のdivは使用しないでください。 InputGroupではInputGroup.Input/InputGroup.Textareaを使用してください。InputGroup.Root内に生のInput/Textareaを配置しないでください。- 入力内のボタンには
InputGroup.Root+InputGroup.Addonを使用してください。 - 選択肢のセット(2~7 個)には
ToggleGroupを使用してください。Buttonをループさせて手動でアクティブ状態を管理しないでください。 - 関連するチェックボックス/ラジオボタンのグループには
Field.FieldSet+Field.FieldLegendを使用してください。 見出しを含むdivは使用しないでください。 - フィールドの検証では
data-invalid+aria-invalidを使用してください。data-invalidはFieldに、aria-invalidはコントロールに設定します。無効化する場合は、data-disabledをFieldに、disabledをコントロールに設定します。
コンポーネントの構成 → composition.md
- 項目は必ずグループの中に配置します。
Select.Item→Select.Group。DropdownMenu.Item→DropdownMenu.Group。Command.Item→Command.Group。 - カスタムトリガー。 コントロールを
Dialog.Trigger/AlertDialog.Triggerでラップするか、ルートのbind:openで開閉状態を制御します。コンポーネントのドキュメントを参照してください。 - Dialog、Sheet、Drawer には必ずタイトルが必要です。 アクセシビリティのため、
Dialog.Title、Sheet.Title、Drawer.Titleが必要です。視覚的に非表示にする場合はclass="sr-only"を使用します。 - Card の構成要素をすべて使用します。
Card.Header/Card.Title/Card.Description/Card.Content/Card.Footer。すべてをCard.Contentに詰め込まないでください。 - Button に
isPending/isLoadingはありません。Button内にSpinnerを配置し、disabledを指定して組み合わせます。適切な間隔を確保するには、Spinnerにdata-icon="inline-start"/inline-endを指定します(import { Button }、import { Spinner })。 Tabs.Triggerは必ずTabs.Listの中に配置します。Tabs内にトリガーを直接レンダリングしないでください。Avatarには必ずAvatar.Fallbackが必要です。 画像の読み込みに失敗した場合に使用します。
カスタムマークアップではなくコンポーネントを使用する → composition.md
- カスタムマークアップを書く前に、既存のコンポーネントを使用します。 スタイルを設定した
divを書く前に、該当するコンポーネントがあるか確認してください。 - コールアウトには
Alertを使用します。 カスタムスタイルの div を作成しないでください。 - 空の状態には
Emptyを使用します。 カスタムの空状態用マークアップを作成しないでください。 - トーストには
svelte-sonnerを使用します。 UI フォルダーにある Sonner コンポーネントとともに、svelte-sonnerのtoast()を使用します。 <hr>やボーダーのみのクラスを指定したdivの代わりに、Separatorを使用します。- 読み込み中のプレースホルダーには
Skeletonを使用します。 カスタムのanimate-pulsediv は使用しないでください。 - カスタムスタイルの span の代わりに
Badgeを使用します。
アイコン → icons.md
<Button>内のアイコンにはdata-iconを指定します。 アイコンにdata-icon="inline-start"またはdata-icon="inline-end"を指定します。- コンポーネント内のアイコンにサイズ指定クラスを付けないでください。 アイコンのサイズはコンポーネントが CSS で調整します。
size-4やw-4 h-4は使用しないでください。 - アイコンはコンポーネントとして渡します。 文字列キーではなく、設定済みの
iconLibrary(例:@lucide/svelte)からインポートします。
CLI
- プリセット — shadcn-svelte.com のデザインシステムビルダーからエンコード済み文字列をコピーし、
npx shadcn-svelte@latest init --preset <code>に渡します。
主なパターン
これらは、正しい shadcn-svelte コードを特徴づける、最も一般的なパターンです。特殊なケースについては、上記のリンク先のルールファイルを参照してください。
<script lang="ts">
import * as Field from "$lib/components/ui/field";
import { Input } from "$lib/components/ui/input";
import { Button } from "$lib/components/ui/button";
import SearchIcon from "@lucide/svelte/icons/search";
import { Badge } from "$lib/components/ui/badge";
import * as Avatar from "$lib/components/ui/avatar";
</script>
<Field.FieldGroup>
<Field.Field>
<Field.FieldLabel for="email">Email</Field.FieldLabel>
<Input id="email" />
</Field.Field>
</Field.FieldGroup>
<Field.Field data-invalid>
<Field.FieldLabel for="email">Email</Field.FieldLabel>
<Input id="email" aria-invalid />
<Field.FieldDescription>Invalid email.</Field.FieldDescription>
</Field.Field>
<Button>
<SearchIcon data-icon="inline-start" />
Search
</Button>
<div class="flex flex-col gap-4"></div>
<Avatar.Root class="size-10">
<Avatar.Image src="/u.png" alt="User" />
<Avatar.Fallback>U</Avatar.Fallback>
</Avatar.Root>
<Badge variant="secondary">+20.1%</Badge>
コンポーネントの選択
| ニーズ | 使用するもの |
|---|---|
| ボタン/アクション | 適切なバリアントを指定した Button(import { Button }) |
| フォーム入力 | Input、Select、Combobox、Switch、Checkbox、RadioGroup、Textarea、InputOTP、Slider |
| 2~5 個の選択肢の切り替え | ToggleGroup.Root + ToggleGroup.Item |
| データ表示 | Table、Card、Badge、Avatar |
| ナビゲーション | Sidebar、NavigationMenu、Breadcrumb、Tabs、Pagination |
| オーバーレイ | Dialog(モーダル)、Sheet(サイドパネル)、Drawer(ボトムシート)、AlertDialog(確認) |
| フィードバック | svelte-sonner(トースト)、Alert、Progress、Skeleton、Spinner |
| コマンドパレット | Dialog 内の Command |
| チャート | Chart(LayerChart) |
| レイアウト | Card、Separator、Resizable、ScrollArea、Accordion、Collapsible |
| 空の状態 | Empty |
| メニュー | DropdownMenu、ContextMenu、Menubar |
| ツールチップ/情報 | Tooltip、HoverCard、Popover |
主なフィールド
別の info コマンドではなく、components.json とファイルシステムを使用してください。
aliases→ 設定にある実際のエイリアスプレフィックス(例:$lib/)を使用してください。無関係なプロジェクトの値をハードコードしないでください。tailwind.css→ テーマ変数が定義されているグローバル CSS ファイルです。テーマを調整する場合はこのファイルを編集してください。ユーザーがすでに使用している場合を除き、別のグローバルファイルを追加しないでください。style→ ビジュアルスタイル(例:nova、vega、…)とレジストリのスタイルパスです。iconLibrary→ アイコンパッケージ(@lucide/svelte、@tabler/icons-svelteなど)を特定します。@lucide/svelteと決めつけないでください。registry→ CLI がコンポーネントを取得する場所です。デフォルトは公式レジストリのshadcn-svelte.comです。resolvedPaths(概念上の項目)→ CLI はaliasesを絶対パスに解決します。インストール済みコンポーネントを確認するには、ディスク上のaliases.uiを一覧表示してください。
コマンドとフラグについては、cli.md を参照してください。
コンポーネントのドキュメント、例、使用方法
ドキュメントと例については、https://shadcn-svelte.com/docs/components/<name>.md を開いてください。コンポーネントを作成、修正、デバッグ、または使用する際は、ドキュメントに記載された API に従えるよう、まず公式ページを読んでください。
ワークフロー
- プロジェクトのコンテキストを把握する —
components.jsonを読み、必要に応じて UI コンポーネントのディレクトリを一覧表示します。 - まずインストール済みのコンポーネントを確認する —
addを実行する前に、解決されたuiパス配下のファイルを一覧表示します。追加されていないコンポーネントはインポートせず、更新する場合を除き、すでに存在するコンポーネントを再追加しないでください。 - コンポーネントを探す — 引数なしで
npx shadcn-svelte@latest addを実行して対話形式の一覧を表示するか、ドキュメントサイトを確認します。 - インストールまたは更新する —
npx shadcn-svelte@latest add <name>またはレジストリの URL を使用します。レジストリから既存のファイルを更新するには、npx shadcn-svelte@latest updateを使用します(cli.md を参照)。 - サードパーティ製または URL から追加した項目のインポートを修正する — カスタムレジストリ URL から追加した後、プロジェクトの
aliasesと一致しないハードコードされたパスがないか確認します。インポートを書き換えて、components.jsonにあるプロジェクトのui/libエイリアスを使用します。 - 追加したコンポーネントを確認する — 追加した後、追加されたファイルを読み、構成(グループ、タイトル、検証属性)を確認します。アイコンのインポートを
iconLibraryに合わせます。 - リモートレジストリの項目 — URL による追加は明示的な操作です。ユーザーが不明なソースのコンポーネントを希望する場合は、
addを実行する前にレジストリ URL または項目を確認してください。
コンポーネントの更新
update コマンドを使用して、プロジェクトにすでにあるコンポーネントの最新のレジストリバージョンを取得します。update の後、git diff で変更を確認してください。
- ローカルの作業をコミットするか、スタッシュします。
npx shadcn-svelte@latest update [component]または--allを実行します。- ファイルをカスタマイズしている場合は、マージの競合を解決します。
- 意図的な編集が失われる場合は、ユーザーの明示的な承認なしに
addで--overwriteを使用しないでください。
クイックリファレンス
# Initialize shadcn-svelte in your project.
npx shadcn-svelte@latest init
# Initialize with a preset string from the docs site builder.
npx shadcn-svelte@latest init --preset <code>
# Add components (interactive when run with no names).
npx shadcn-svelte@latest add
npx shadcn-svelte@latest add button card dialog
npx shadcn-svelte@latest add --all
# Update components already installed.
npx shadcn-svelte@latest update button
npx shadcn-svelte@latest update --all --yes
# Build a custom registry (registry authors).
npx shadcn-svelte@latest registry build
レジストリ: デフォルトは https://shadcn-svelte.com/registry です。必要に応じて components.json で上書きできます。
ドキュメント: shadcn-svelte.com
詳細なリファレンス
- rules/forms.md — Field.FieldGroup、Field.Field、InputGroup、ToggleGroup、Field.FieldSet、検証状態
- rules/composition.md — グループ、オーバーレイ、Card、Tabs、Avatar、Alert、Empty、Toast、Separator、Skeleton、Badge、Button の読み込み状態
- rules/icons.md — data-icon、アイコンのサイズ設定、アイコンコンポーネントの渡し方
- rules/styling.md — セマンティックカラー、バリアント、class、間隔、サイズ、省略表示、ダークモード、cn()、z-index
- cli.md — コマンド、フラグ、レジストリ
- customization.md — テーマ設定、CSS 変数、コンポーネントの拡張