dashboard-design について
dashboard-designは、レイアウト、チャート、テーブル、ステータス表示、アクセシビリティを扱うダッシュボード設計スキルです。デザインコンテキストとトークンの確認から、画面幅ごとの描画チェックまで、デザイナーやコーディングエージェントを支援します。
主な機能
- 01サイドバーまたは上部ナビゲーションの選択
- 02データ種別に応じたチャート選び
- 03再利用可能なデザイントークンの適用
- 04レスポンシブなカードとテーブルの設計
- 05アクセシビリティと描画スクリーンショットの確認
活用シーン
- 01運用指標ダッシュボードの計画
- 02推移や比較データに使うチャートの選定
- 03モバイル向けのテーブルとナビゲーション調整
- 04複数の画面幅で生成したダッシュボードを確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ arnavpuri/ designskills --skill dashboard-designインストール後、Claude Code で/dashboard-designを入力して読み込まれたか確認します。
詳細
ダッシュボードのデザイン
始める前に:デザインコンテキストを読み込む
.agents/design-context.mdを読みます(design-contextスキルによって作成されます)。存在しない場合は、tailwind.config.*または:rootの CSS 変数からトークンを探します。何もない場合は、デフォルト(Primary#2563EB、Secondary#7C3AED、Accent#F59E0B、Tailwind のグレーニュートラル、見出しと本文に Inter、Minimal スタイル)を使い、デフォルトを使用したことをユーザーに伝えます。design-contextの実行を提案してください。- トークンを CSS 変数に一度だけ対応付け、以降は変数のみを使います:
--color-primary、--color-primary-light、--color-primary-dark、--color-secondary、--color-accent、--color-neutral-50…--color-neutral-900、--color-success/-warning/-error、--font-heading、--font-body、--font-mono、--radius、および4pxを基準とするスペーシングスケール。 - Tailwind: 同じ変数を
primary、primary-light、primary-dark、secondary、accent、neutral-*、font-heading、font-bodyとして公開します(v3 はtheme.extend、v4 は@theme)。以下の例にあるindigo-*/gray-*クラスは、これらのトークンのプレースホルダーです。 - Figma: ユーザーから Figma の URL が提供された場合は、Figma MCP(
get_design_context、get_screenshot)で取得してデザインを合わせます。そのデザインでは、コンテキストファイルよりも優先されます。 - 表示するデータ、利用者、利用者が行う操作について質問するか、推測します。Success/Warning/Error をステータスバッジに対応付け、チャートの色を Primary/Secondary/Accent から導きます(セクション3)。
1. レイアウトパターン
パターン A:サイドバー+メインコンテンツ(最も一般的)
<div class="flex h-screen bg-gray-50">
<aside class="hidden lg:flex w-64 shrink-0 bg-white border-r border-gray-200 flex-col">
<div class="h-16 flex items-center px-6 border-b border-gray-100">
<img src="/logo.svg" alt="App" class="h-8" />
</div>
<nav aria-label="Main" class="flex-1 py-4 px-3 space-y-1 overflow-y-auto">
<a href="#" aria-current="page" class="flex items-center gap-3 px-3 py-2 rounded-lg
bg-indigo-50 text-indigo-700 font-medium text-sm">
<svg class="w-5 h-5" aria-hidden="true"></svg>
Dashboard
</a>
<a href="#" class="flex items-center gap-3 px-3 py-2 rounded-lg
text-gray-600 hover:bg-gray-100 hover:text-gray-900 text-sm transition-colors">
<svg class="w-5 h-5" aria-hidden="true"></svg>
Analytics
</a>
<div class="pt-4 pb-1 px-3 text-xs font-semibold text-gray-500 uppercase tracking-wider">
Settings
</div>
</nav>
<div class="p-4 border-t border-gray-100">
<div class="flex items-center gap-3">
<img src="/avatar.jpg" alt="" class="w-8 h-8 rounded-full" />
<div class="text-sm">
<div class="font-medium text-gray-900">Jane Doe</div>
<div class="text-gray-500 text-xs">Admin</div>
</div>
</div>
</div>
</aside>
<main class="flex-1 min-w-0 overflow-y-auto">
<header class="h-16 bg-white border-b border-gray-200 flex items-center
justify-between px-6 sticky top-0 z-10">
<h1 class="text-lg font-semibold text-gray-900">Dashboard</h1>
<div class="flex items-center gap-4">
</div>
</header>
<div class="p-6">
</div>
</main>
</div>
サイドバーの動作
- デスクトップ(lg+):常に表示し、幅は240~280pxにします。
- タブレット(md):ツールチップラベル付きでアイコンのみ(64px)に折りたためるようにします。
- モバイル(< md):非表示にし、ラベル付きメニューボタン(
aria-expanded、ドロワー内にフォーカスを移動、Esc で閉じる)から、背景を伴うオーバーレイドロワーとして開きます。 - ブレークポイントは ui-design の Tailwind デフォルトに従います(md 768、lg 1024、xl 1280、2xl 1536)。
パターン B:トップナビ+グリッド
- ナビゲーション項目が少ないシンプルなダッシュボードに最適です。
- 上部に横並びのナビゲーションバーを配置し、その下をコンテンツで埋めます。
- サブセクションにはタブまたはピル型ナビゲーションを使います。
2. データカード(KPI タイル)
標準的な統計カード
<div class="bg-white rounded-xl border border-gray-200 p-6">
<div class="flex items-center justify-between">
<span class="text-sm font-medium text-gray-500">Total Revenue</span>
<span class="w-10 h-10 rounded-lg bg-emerald-50 text-emerald-600
flex items-center justify-center">
<svg class="w-5 h-5" aria-hidden="true"></svg>
</span>
</div>
<div class="mt-3">
<span class="text-3xl font-bold text-gray-900">$45,231</span>
</div>
<div class="mt-2 flex items-center gap-1.5 text-sm">
<span class="text-emerald-600 font-medium flex items-center gap-0.5">
<svg class="w-4 h-4" aria-hidden="true"></svg>
<span class="sr-only">Up</span> +12.5%
</span>
<span class="text-gray-500">vs last month</span>
</div>
</div>
カードグリッドのレイアウト
<div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-4 md:gap-6">
</div>
カードのバリエーション
- スパークライン付き: 数値の下に小さなインラインチャートを追加します。
- プログレスバー付き: 目標に対する達成状況を表示します。
- ミニテーブル付き: 統計値の下に上位3項目を表示します。
- マイナス傾向: 赤色と下向き矢印、マイナス記号を使います。色だけで表現してはいけません(色覚障害のあるユーザーに配慮)。
- 読み込み中:グリッドがずれないよう、スピナーではなく同じサイズのスケルトンタイルを表示します。
3. チャートの選択ガイド
| データの種類 | 最適なチャート | 使用場面 |
|---|---|---|
| 時系列の傾向 | 折れ線グラフ | 日別/月別の収益、ユーザー数、パフォーマンス |
| 比較 | 棒グラフ | カテゴリや A/B テストの結果の比較 |
| 構成 | 円グラフ/ドーナツグラフ | 予算の内訳、トラフィックソース(最大5区分) |
| 時系列の量 | 面グラフ | 帯域幅、累積指標 |
| 分布 | ヒストグラム | 年齢層、価格帯 |
| 関係性 | 散布図 | 2つの変数間の相関 |
| 進捗 | プログレスバー/ゲージ | 目標の達成状況、割り当て上限 |
| 順位 | 横棒グラフ | 上位ページ、上位製品 |
チャートのデザインルール
- 各チャートにタイトルを付けます。 読み方ではなく、何を示すかを記載します。
- 軸を明確にラベル付けします。 単位も含めます。
- 色は最大5~6色に制限し、ブランドトークンから選びます。 各系列色はチャート背景に対して3:1のコントラスト比を確保します(WCAG 1.4.11)。色だけが手掛かりにならないよう、直接ラベルやパターンを追加します。
- 棒グラフの Y 軸はゼロから始めます。 折れ線グラフではゼロ以外を基準にしてもかまいません。
- ホバー時に正確な値を表示するツールチップを追加します。
- グリッド線は控えめに使います。 実線ではなく、薄い破線を使います。
- レスポンシブにします。 チャートはサイズを調整し、はみ出さないようにします。
グラフのカラーパレット
:root {
/* Lightness ≤ ~65% keeps ≥ 3:1 against white; lighten ~10–15% for dark backgrounds */
--chart-1: var(--color-primary);
--chart-2: oklch(58% 0.12 185); /* teal */
--chart-3: oklch(58% 0.19 350); /* pink */
--chart-4: oklch(64% 0.15 60); /* amber/orange */
--chart-5: oklch(55% 0.14 145); /* green */
}
dataviz などのデータ可視化スキルがインストールされている場合は、グラフのマーク、凡例、ツールチップにその指示を適用します。
4. テーブルデザイン
高機能データテーブル
<div class="bg-white rounded-xl border border-gray-200 overflow-hidden">
<div class="px-6 py-4 border-b border-gray-100 flex items-center justify-between">
<div class="flex items-center gap-3">
<h2 class="font-semibold text-gray-900">Recent Orders</h2>
<span class="bg-gray-100 text-gray-600 text-xs font-medium px-2.5 py-0.5 rounded-full">
2,847
</span>
</div>
<div class="flex items-center gap-2">
<input type="search" placeholder="Search orders…" aria-label="Search orders"
class="text-sm border border-gray-300 rounded-lg px-3 py-1.5 w-full sm:w-56
focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" />
<button type="button" class="text-sm text-gray-600 border border-gray-300 rounded-lg
px-3 py-1.5 hover:bg-gray-50 flex items-center gap-1.5">
<svg class="w-4 h-4" aria-hidden="true"></svg>
Filters
</button>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full text-sm">
<caption class="sr-only">Recent orders</caption>
<thead>
<tr class="border-b border-gray-100 text-left">
<th scope="col" aria-sort="ascending" class="px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider">
<button type="button" class="flex items-center gap-1 hover:text-gray-700">
Customer
<svg class="w-3 h-3" aria-hidden="true"></svg>
</button>
</th>
<th scope="col" class="px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider">
Status
</th>
<th scope="col" class="px-6 py-3 text-xs font-medium text-gray-500 uppercase tracking-wider
text-right">
Amount
</th>
<th scope="col" class="px-6 py-3 w-12"><span class="sr-only">Actions</span></th>
</tr>
</thead>
<tbody class="divide-y divide-gray-50">
<tr class="hover:bg-gray-50 transition-colors">
<td class="px-6 py-4">
<div class="flex items-center gap-3">
<img src="/avatar.jpg" alt="" class="w-8 h-8 rounded-full" />
<div>
<div class="font-medium text-gray-900">Jane Cooper</div>
<div class="text-gray-500 text-xs">[email protected]</div>
</div>
</div>
</td>
<td class="px-6 py-4">
<span class="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full
text-xs font-medium bg-emerald-50 text-emerald-700">
<span class="w-1.5 h-1.5 rounded-full bg-emerald-500"></span>
Completed
</span>
</td>
<td class="px-6 py-4 text-right font-medium text-gray-900">$2,500.00</td>
<td class="px-6 py-4">
<button type="button" aria-label="Actions for Jane Cooper" aria-haspopup="menu"
class="p-1.5 rounded-md text-gray-500 hover:text-gray-700 hover:bg-gray-100">
<svg class="w-5 h-5" aria-hidden="true"></svg>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<nav aria-label="Pagination" class="px-6 py-4 border-t border-gray-100 flex items-center justify-between text-sm">
<span class="text-gray-500">Showing 1-10 of 2,847</span>
<div class="flex gap-1">
<button class="px-3 py-1.5 rounded-lg border border-gray-200 text-gray-600
hover:bg-gray-50 disabled:opacity-50" disabled>Previous</button>
<button class="px-3 py-1.5 rounded-lg bg-indigo-600 text-white" aria-current="page">1</button>
<button class="px-3 py-1.5 rounded-lg border border-gray-200 text-gray-600
hover:bg-gray-50">2</button>
<button class="px-3 py-1.5 rounded-lg border border-gray-200 text-gray-600
hover:bg-gray-50">Next</button>
</div>
</nav>
</div>
テーブルデザインのルール
- 数値は右揃え、テキストは左揃えにします。
- 行にホバー時のハイライトを適用します(
hover:bg-gray-50)。 - スクロール時にヘッダーを固定します(背景色を設定した
<th>にsticky top-0を適用します。そうしないと、ヘッダー越しに行が見えてしまいます)。 - 列を並べ替えられるようにするには、
<th>内に<button>を配置し、並べ替え中の列にaria-sortを指定します。 - ゼブラストライプは任意です。控えめな区切り線を推奨します。
- 行アクションには、ドロップダウンを開くアイコンボタン(三点リーダー)を使います。
5. ステータスインジケーター
バッジのスタイル
<span class="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-xs
font-medium bg-emerald-50 text-emerald-700">
<span class="w-1.5 h-1.5 rounded-full bg-emerald-500"></span>Active
</span>
<span class="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-xs
font-medium bg-amber-50 text-amber-700">
<span class="w-1.5 h-1.5 rounded-full bg-amber-500"></span>Pending
</span>
<span class="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-xs
font-medium bg-red-50 text-red-700">
<span class="w-1.5 h-1.5 rounded-full bg-red-500"></span>Failed
</span>
<span class="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-xs
font-medium bg-gray-100 text-gray-600">
<span class="w-1.5 h-1.5 rounded-full bg-gray-400"></span>Draft
</span>
プログレスバー
<div class="w-full bg-gray-100 rounded-full h-2">
<div class="bg-indigo-600 h-2 rounded-full transition-all duration-500"
style="width: 65%"></div>
</div>
6. ダークモードのダッシュボード
監視や運用のダッシュボードは、ダークモードで使われることがよくあります。ここで別のトークンセットを定義せず、dark-mode スキルの完全なトークンシステム(--bg-base / --bg-surface / --bg-elevated、--text-*、--border)のサーフェス、テキスト、ボーダーのトークンを使用します。
ダッシュボード固有のルール
- 影ではなく、より明るいサーフェスで高さを表現します。
- グラフの色の彩度を約15%下げ、明度を上げて、ダークサーフェス上でも系列のコントラスト比が3:1になるようにします。
- 半透明のボーダーを使います(
oklch(100% 0 0 / 0.08))。 - アクティブなサイドバー項目には色を付けず、より明るい背景を使います。
7. リアルタイムデータインジケーター
ライブパルスドット
<span class="relative flex h-2.5 w-2.5" aria-hidden="true">
<span class="motion-safe:animate-ping absolute inline-flex h-full w-full rounded-full
bg-emerald-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-2.5 w-2.5 bg-emerald-500"></span>
</span>
最終更新時刻
<span class="text-xs text-gray-500 flex items-center gap-1.5" role="status">
<span class="w-1.5 h-1.5 rounded-full bg-emerald-500" aria-hidden="true"></span>
Live — Updated 3s ago
</span>
自動更新パターン
- 更新前に、控えめなカウントダウンまたはプログレスバーを表示します。
- 変更された値をアニメーション表示します(増加時は緑、減少時は赤に点滅)。
- ページ全体を更新せず、個々のデータポイントだけを更新します。
- 変化の速い数値を
aria-live領域に入れないでください(スクリーンリーダーに大量の通知が流れます)。「新しい注文が3件あります」など、重要なイベントだけを通知します。
8. ごちゃつかずに多くの情報を表示する
テクニック
- 段階的な情報開示:概要を表示し、詳細は展開して表示します。
- タブ付きセクション:すべてを一度に表示しないようにします。
- 折りたたみ可能なパネル:不要な情報をユーザーが非表示にできるようにします。
- 補足情報にはツールチップを使い、必須のラベルには使わない:キーボードフォーカス時とタップ時にも開く必要があります。
- 一貫した余白:ui-design の4px単位のスケール(4、8、12、16、24、32、48、64)を使います。
- 小さめの基本フォントサイズ:ダッシュボードの本文には13〜14pxを使用できます(12px未満にはしないでください)。
- データには等幅数字を使う:テーブルや KPI の数値には
tabular-numsを使い、桁を揃えます。
.data-table td {
font-variant-numeric: tabular-nums; /* Tailwind: tabular-nums */
}
9. レスポンシブなダッシュボードレイアウト
ブレークポイント戦略
- モバイル(< 768px):1列にします。カードを縦に並べます。テーブルはカードリストにします。サイドバーは非表示にします。
- タブレット(768〜1024px):2列のグリッドにします。サイドバーはアイコン表示に折りたたみます。グラフを簡略化します。
- デスクトップ(1024px以上):完全なレイアウトにします。サイドバーを展開します。複数列のグリッドを使います。
- ワイド(1536px以上):レイアウトを引き伸ばすのではなく、列を1つ追加します。テキストの多いコンテンツの最大幅は約1440pxにします(
max-w-screen-2xlなど)。
モバイルでのテーブルの代替表示
md 未満(768px)では、テーブルを非表示にし(ラッパーに hidden md:block を指定)、各行をカードとして表示します。
<dl class="md:hidden bg-white rounded-xl border border-gray-200 p-4 space-y-2 text-sm">
<div class="flex justify-between">
<dt class="text-gray-500">Customer</dt>
<dd class="font-medium text-gray-900">Jane Cooper</dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">Status</dt>
<dd><span class="bg-emerald-50 text-emerald-700 text-xs px-2 py-0.5 rounded-full">Active</span></dd>
</div>
<div class="flex justify-between">
<dt class="text-gray-500">Amount</dt>
<dd class="font-medium text-gray-900">$2,500.00</dd>
</div>
</dl>
検証:レンダリングして確認する
自分で確認していないコードを引き渡さないでください。生成後、以下を実行します。
- モバイルとデスクトップの幅でスクリーンショットを撮ります。例:
npx playwright screenshot --full-page --viewport-size=390,844 file://$PWD/index.html mobile.pngを実行し、続けて--viewport-size=1440,900を指定します(または開発サーバーの URL を指定します)。 - 両方の画像を開いて確認します。横スクロールやテキストの切れ・重なりがないこと、ひと目で階層構造が把握できること、ブランドトークンが適用されていること、画像のアスペクト比が適切であることを確認します。
- 一度 Tab キーで移動します。すべてのインタラクティブ要素に、論理的な順序で視認可能なフォーカスリングが表示されることを確認します。
- 768px でもスクリーンショットを撮ります。サイドバーが折りたたまれること、テーブルがスクロール可能になるかカード表示に切り替わること、グラフがはみ出さずにサイズ変更されることを確認します。ダークテーマを実装した場合は、それも確認します。
- 見つかった問題を修正し、完了を報告する前にもう一度スクリーンショットを撮ります。
ダッシュボードのデザインチェックリスト
- アクティブ状態が明確で、セクションごとにグループ化されたサイドバーナビゲーション
- 上部にトレンド指標付きの KPI カード
- チャートにタイトル、ラベル、ツールチップがある
- テーブルに並べ替え、検索、フィルター、ページネーションがある
- ステータスバッジの色分けが統一されている
- レスポンシブ対応:タブレットとモバイルで動作する
- 非同期データすべてにローディングスケルトンがある
- データがないテーブルやチャートに空の状態が表示される
- ダークモードを考慮する(特にモニタリングダッシュボード)
- 数値の配置に
tabular-numsを使用する - アイコンのみのボタンと検索入力にアクセシブルな名前があり、トレンドを色だけに頼らず表現している
- 390px、768px、1440px でレンダリングしてスクリーンショットを撮る(「検証」を参照)
コメント
Markdown 対応