skeleton について
Svelte、特に SvelteKit で Skeleton UI を使うための開発リファレンスです。コンポーネントの設定、テーマの利用、よくある問題への対処を扱います。
主な機能
- 01Svelte と SvelteKit の設定ガイド
- 02レイアウトとフォームのコンポーネント
- 03デザイントークンとテーマのガイド
- 04ストアの初期化とトラブルシューティング
活用シーン
- 01SvelteKit アプリでの Skeleton の設定
- 02テーマ対応の色とダークモードの適用
- 03モーダル、トースト、スタイルの問題解決
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill skeletonインストール後、Claude Code で/skeletonを入力して読み込まれたか確認します。
同梱ファイルquick-ref/components-cheatsheet.mdtheming.md
詳細
Skeleton UI スキル
完全なリファレンス:デザイントークン、カスタムテーマ、テーマの切り替え、データ表示(カード、テーブル、アバター)、フィードバック(トースト、モーダル)、ナビゲーション(タブ、ステッパー、ページネーション)、ストアの設定については、theming.md を参照してください。
このスキルを使用しない場合
- React/Vue/Angular プロジェクト - Skeleton は Svelte 専用です
- プレーンな HTML/CSS - Skeleton には Svelte と Tailwind CSS が必要です
- ヘッドレス UI が必要な場合 - Skeleton はスタイル付きコンポーネントを提供します
- SvelteKit を使用していない場合 - Skeleton は SvelteKit 向けに最適化されています
インストール
# Create new SvelteKit project
npx sv create my-app
cd my-app
# Add Skeleton
npx @skeletonlabs/skeleton-cli add skeleton
# Or manual installation
npm install @skeletonlabs/skeleton @skeletonlabs/tw-plugin
npm install -D tailwindcss postcss autoprefixer
設定
tailwind.config.js
import { skeleton } from '@skeletonlabs/tw-plugin';
export default {
darkMode: 'class',
content: [
'./src/**/*.{html,js,svelte,ts}',
require.resolve('@skeletonlabs/skeleton').replace(/\/index\.js$/, '/**/*.{html,js,svelte,ts}')
],
plugins: [
skeleton({
themes: {
preset: ['skeleton', 'modern', 'crimson'],
},
}),
],
};
app.postcss
@import '@skeletonlabs/skeleton/styles/skeleton.css';
@tailwind base;
@tailwind components;
@tailwind utilities;
app.html
<body data-theme="skeleton" class="h-full">
%sveltekit.body%
</body>
レイアウトコンポーネント
AppShell
<script>
import { AppShell, AppBar, AppRail, AppRailTile } from '@skeletonlabs/skeleton';
let { children } = $props();
</script>
<AppShell>
<svelte:fragment slot="header">
<AppBar>
<svelte:fragment slot="lead">
<strong>My App</strong>
</svelte:fragment>
<svelte:fragment slot="trail">
<button class="btn variant-filled-primary">Login</button>
</svelte:fragment>
</AppBar>
</svelte:fragment>
<svelte:fragment slot="sidebarLeft">
<AppRail>
<AppRailTile label="Home">🏠</AppRailTile>
<AppRailTile label="Settings">⚙️</AppRailTile>
</AppRail>
</svelte:fragment>
{@render children()}
</AppShell>
フォームコンポーネント
ボタン
<button class="btn variant-filled-primary">Primary</button>
<button class="btn variant-ghost-primary">Ghost</button>
<button class="btn variant-soft-primary">Soft</button>
<button class="btn variant-ringed-primary">Ringed</button>
<button class="btn btn-sm">Small</button>
<button class="btn btn-lg">Large</button>
<button class="btn-icon variant-filled-primary">🔔</button>
入力
<label class="label">
<span>Email</span>
<input class="input" type="email" placeholder="Enter email" />
</label>
<label class="label">
<span>Message</span>
<textarea class="textarea" rows="4"></textarea>
</label>
<label class="label">
<span>Country</span>
<select class="select">
<option value="us">United States</option>
<option value="uk">United Kingdom</option>
</select>
</label>
チェックボックス、ラジオボタン、トグル
<label class="flex items-center space-x-2">
<input class="checkbox" type="checkbox" />
<span>Accept terms</span>
</label>
<label class="flex items-center space-x-2">
<input class="radio" type="radio" name="plan" value="pro" />
<span>Pro</span>
</label>
<label class="flex items-center space-x-2">
<input class="toggle" type="checkbox" />
<span>Dark mode</span>
</label>
データ表示
カード
<div class="card p-4">
<header class="card-header">
<h3 class="h3">Card Title</h3>
</header>
<section class="p-4">Card content</section>
<footer class="card-footer">
<button class="btn variant-filled-primary">Action</button>
</footer>
</div>
<a href="/item/1" class="card card-hover p-4">Clickable</a>
リスト
<nav class="list-nav">
<ul>
<li><a href="/">Dashboard</a></li>
<li><a href="/users">Users</a></li>
</ul>
</nav>
ユーティリティクラス
<div class="bg-surface-100-800-token">Adapts to theme</div>
<h1 class="h1">Heading 1</h1>
<h2 class="h2">Heading 2</h2>
<p class="lead">Lead paragraph</p>
<span class="badge variant-filled-primary">Badge</span>
<span class="chip variant-filled-tertiary">Chip</span>
デザイントークン
/* Base colors */
--color-primary-500
--color-secondary-500
--color-surface-500
/* Color shades: 50-950 */
--color-primary-50 /* Lightest */
--color-primary-500 /* Base */
--color-primary-950 /* Darkest */
/* Typography */
--base-font-family
--heading-font-family
/* Border radius */
--theme-rounded-base
--theme-rounded-container
デザイントークンの使用
<div class="bg-primary-500 text-on-primary-token">
Primary background
</div>
<div style="background-color: rgb(var(--color-primary-500));">
Custom styling
</div>
ベストプラクティス
- ルートレイアウトでストアを必ず初期化します
- 一貫したスタイル設定にはバリアントクラスを使用します
- テーマに対応した色にはデザイントークンを活用します
- ダークモードとライトモードを自動で切り替えるには
-token接尾辞を使用します - アクセシビリティを意識し、セマンティック HTML を使用します
アンチパターン
| アンチパターン | 問題点 | 正しい方法 |
|---|---|---|
| ストアを初期化しない | モーダルやトーストが動作しません | レイアウトで initializeStores() を呼び出します |
skeleton.css を忘れる | コンポーネントにスタイルが適用されません | Tailwind ディレクティブより前にインポートします |
| Tailwind の標準色を使用する | テーマ設定が崩れます | デザイントークンを使用します |
data-theme がない | テーマが適用されません | <body> に追加します |
darkMode: 'media' | ダークモードの設定が誤っています | darkMode: 'class' を設定します |
トラブルシューティング(クイックガイド)
| 問題 | 解決策 |
|---|---|
| モーダルが表示されない | ルートレイアウトで initializeStores() を呼び出します |
| スタイルが適用されない | app.postcss で skeleton.css をインポートします |
| テーマが適用されない | body に data-theme="skeleton" を追加します |
| ダークモードが動作しない | tailwind.config で darkMode: 'class' を設定します |
| トーストが表示されない | ルートレイアウトに <Toast /> を追加します |
リファレンスドキュメント
コメント
Markdown 対応