Guide / 25 min

ソフトウェアエンジニアのためのデザイン原則

よりよいソフトウェアを構築するためのデザインの基礎を学べます。タイポグラフィ、色彩理論、スペーシング、アニメーション、AIインターフェースのパターンに加え、ArcからZomatoまで48のプロダクト事例を紹介します。

2026年5月18日更新

2026年5月18日更新: Design Studies のインデックスを現在の48件の事例コーパスに合わせて更新し、AIインターフェースパターンにエージェント的なワークフローの根拠を追加しました。チェックポイント、承認状態、情報源の信頼度、可視化された検証が含まれます。

2026年5月更新: WCAG 3.0の2026年3月作業草案と、WCAG 2.2と3.0は共存するというW3Cの立場に関する注記を追加しました。現在のアクセシビリティ対応では、引き続きWCAG 2.2を目標標準とするべきです。

2026年2月更新: 新たに2つのセクションを追加しました。Interaction Patterns(Framer、Flighty、Halide、Warp、Bear、Craft、Superhumanの調査から得た8つのパラダイム)と、AI Interface Patterns(引用を前面に出したデザイン、ストリーミングの段階、Perplexityに見られるエラーの透明性)です。Web Patternsを2026年版に更新し、アンカー配置、スクロール駆動アニメーション、@starting-styleを反映しました。アクセシビリティについては、WCAG 2.2のISO標準化を反映しました。48の優れた製品を深掘りした内容は、Design Studiesをご覧ください。 ソフトウェアを作りながら、何年もデザインを学んできました。Dieter Ramsのような巨匠の原則を吸収し、Linear、Stripe、Raycastのようなプロダクトのインターフェースを分解してきました。このガイドでは、その理解を、自分のソフトウェアの見た目や使い心地を気にし始めた頃に欲しかった包括的な参照資料としてまとめています。

デザインは装飾ではありません。コミュニケーションです。すべてのピクセルは、機能、階層、意味を伝えます。アマチュアっぽく感じるソフトウェアと、プロフェッショナルに感じるソフトウェアの違いは、これらの原則を理解し、一貫して適用できるかどうかにあります。

このガイドでは、すでにコードを書けることを前提としています。ここで身につけるのは「見る」力です。なぜ、あるインターフェースは自然に使えるのに、別のインターフェースは混沌として感じられるのか。そしてさらに重要なのは、前者をどう作るかです。


目次

Part 1:基礎

  1. Gestalt心理学
  2. タイポグラフィ
  3. 色彩理論
  4. 視覚的階層構造
  5. 余白とリズム
  6. アニメーションの原則

Part 2:インタラクションとAI

  1. インタラクションパターン
  2. AIインターフェースパターン

Part 3:デザイン哲学

  1. Dieter Rams:10の原則

Part 4:実装

  1. Webパターン 2026
  2. デザイントークンシステム
  3. 正しいダークモードの実装
  4. Figma抽出ワークフロー

Part 5:リファレンス

  1. クイックリファレンス表
  2. デザインチェックリスト
  3. デザインスタディ

Gestalt心理学

「全体は部分の総和とは異なるものである」— Kurt Koffka

Gestalt心理学は1920年代のドイツで発展した、人間の視覚情報の知覚メカニズムを説明する理論です。脳は個々のピクセルを見ているのではなく、要素を意味のあるパターンへと組織化しています。これらの原則を習得すれば、ユーザーがインターフェースをどう知覚するかをコントロールできるようになります。

近接の法則

近くにある要素は、グループとして知覚されます。

UI デザインにおいて最も強力なGestalt原則です。余白は他のどの視覚的要素よりも、関係性を雄弁に伝えます。

WRONG (equal spacing = no grouping):
┌─────────────────┐
│ Label           │
│                 │
│ Input Field     │
│                 │
│ Label           │
│                 │
│ Input Field     │
└─────────────────┘

RIGHT (unequal spacing = clear groups):
┌─────────────────┐
│ Label           │
│ Input Field     │ ← Tight (4px) - related
│                 │
│                 │ ← Wide (24px) - separating groups
│ Label           │
│ Input Field     │ ← Tight (4px) - related
└─────────────────┘

CSSでの実装:

.form-group {
  margin-bottom: 24px;  /* Between groups: wide */
}

.form-group label {
  margin-bottom: 4px;   /* Label to input: tight */
  display: block;
}

SwiftUIでの実装:

VStack(alignment: .leading, spacing: 4) {  // Tight within group
    Text("Email")
        .font(.caption)
        .foregroundStyle(.secondary)
    TextField("[email protected]", text: $email)
        .textFieldStyle(.roundedBorder)
}
.padding(.bottom, 24)  // Wide between groups

類似の法則

視覚的特徴を共有する要素は、関連があるように見えます。

要素の見た目が同じであれば、ユーザーは機能も同じだと推測します。デザインシステムでボタンスタイル、カードの処理、タイポグラフィを統一するのはこのためです。

Example Navigation:
┌───────────────────────────────────┐
 [Dashboard] [Projects] [Settings]    Same style = same function
                                   
 ┌─────┐  ┌─────┐  ┌─────┐        
 Card   Card   Card             Same style = same content type
 └─────┘  └─────┘  └─────┘        
                                   
 [+ New Project]                      Different style = different function
└───────────────────────────────────┘

図と地の法則

コンテンツは背景から明確に分離されるべきです。

脳は「図」(注目すべき対象)を「地」(背景)から区別する必要があります。図と地の関係が曖昧だと、視覚的な混乱を招きます。

テクニック: - コントラスト(暗い地に明るい図、またはその逆) - シャドウ(図を地から浮かせる) - ボーダー(図の輪郭を明示する) - ブラー(背景をぼかし、図を鮮明にする)

/* Strong figure-ground relationship */
.card {
  background: var(--color-surface);     /* Figure */
  border-radius: 12px;
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);  /* Elevation */
}

.modal-overlay {
  background: rgba(0, 0, 0, 0.5);  /* Dim ground */
  backdrop-filter: blur(4px);      /* Blur ground */
}

共通領域の法則

境界線で囲まれた要素は、グループとして知覚されます。

要素を視覚的なコンテナ(カード、ボックス、枠線で囲まれた領域)に収めることで、それらが一つのまとまりであることを示せます。

連続の法則

視線はパス、線、曲線に沿って流れます。

整列と視覚的フローを活用し、インターフェース内でユーザーの注意を誘導しましょう。

CONTINUITY IN ALIGNMENT:
┌────────────────────────────────┐
 Logo    [Nav]  [Nav]  [Nav]      Aligned on horizontal axis
├────────────────────────────────┤
                                
 Headline                       
 ─────────────────────────────     Eye follows left edge
 Paragraph text continues       
 along the same left edge       
                                
 [Primary Action]                  Still on the left edge
└────────────────────────────────┘

閉合の法則

脳は不完全な形状を補完します。

ユーザーはすべてのピクセルが描かれていなくても、見慣れた形状を頭の中で補完します。この性質を活かすことで、よりミニマルで洗練されたデザインが実現できます。

/* Horizontal scroll with partial card (closure) */
.card-carousel {
  display: flex;
  gap: 16px;
  overflow-x: auto;
  padding-right: 48px;  /* Show partial card = scroll hint */
}

.card-carousel .card {
  flex: 0 0 280px;  /* Fixed width, partial visible */
}

Gestaltクイックリファレンス

原則 ルール 主な用途
近接 関連あり=近く、関連なし=遠く フォームフィールド、コンテンツセクション
類似 同じ見た目=同じ機能 ボタン、カード、ナビゲーション
図と地 レイヤーの明確な分離 カード、モーダル、オーバーレイ
共通領域 境界がコンテンツをグループ化 設定セクション、ユーザーカード
連続 線と整列に沿って視線が流れる タイムライン、読みの流れ
閉合 脳が形状を補完する アイコン、スクロールヒント、スケルトン

タイポグラフィ

「タイポグラフィとは、人間の言語に永続的な視覚形式を与える技芸である」— Robert Bringhurst

タイポグラフィはインターフェースデザインの土台です。テキストは機能、階層構造、ブランドを伝えます。タイポグラフィが貧弱だとインターフェースは使いにくくなり、優れたタイポグラフィは透明——ただ自然に機能するものです。

タイプスケール

一貫したスケールが視覚的な調和を生み出します。数学的な比率を使いましょう。

1.25スケール(UIに推奨):

:root {
  /* Base: 16px (1rem) */
  --text-xs: 0.64rem;    /* 10.24px - use sparingly */
  --text-sm: 0.8rem;     /* 12.8px - captions, labels */
  --text-base: 1rem;     /* 16px - body text */
  --text-lg: 1.25rem;    /* 20px - lead text */
  --text-xl: 1.563rem;   /* 25px - h4 */
  --text-2xl: 1.953rem;  /* 31.25px - h3 */
  --text-3xl: 2.441rem;  /* 39px - h2 */
  --text-4xl: 3.052rem;  /* 48.8px - h1 */
}

行間(レディング)

行間は可読性に大きく影響します。コンテンツの種類に応じた行間設定が必要です。

コンテンツの種類 行間 理由
見出し 1.1 - 1.2 タイトで太く、短いテキスト
UIテキスト 1.3 - 1.4 ラベル、ボタン
本文 1.5 - 1.7 読みやすい段落
長文コンテンツ 1.7 - 2.0 記事、ドキュメント

行長(メジャー)

最適な行長は目の疲労を防ぎ、読解力を向上させます。

  • 最適値: 1行あたり45〜75文字
  • 目標値: 50〜65文字
  • 絶対上限: 85文字
p {
  max-width: 65ch;  /* ch unit = width of '0' character */
}

.article-body {
  max-width: 70ch;
  margin: 0 auto;
}

フォント選択

まずシステムフォントを使いましょう。 読み込みが即座に行われ、プラットフォームに馴染み、スクリーン表示に最適化されています。

:root {
  --font-sans: system-ui, -apple-system, BlinkMacSystemFont,
               'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;

  --font-mono: ui-monospace, 'SF Mono', 'Cascadia Code',
               'JetBrains Mono', Consolas, monospace;
}

カスタムフォントを使うべき場面: - ブランドの差別化(マーケティングサイト) - エディトリアル・出版物のような雰囲気 - システムフォントでは実現できない特定のデザイン意図

フォントウェイトによる階層構造

サイズだけでなく、ウェイトを使って階層構造を確立しましょう。

h1 { font-weight: 700; }  /* Bold */
h2 { font-weight: 600; }  /* Semibold */
h3 { font-weight: 600; }  /* Semibold */
.lead { font-weight: 500; }  /* Medium */
p { font-weight: 400; }   /* Regular */
.meta { font-weight: 400; color: var(--text-muted); }

タイポグラフィ クイックリファレンス

プロパティ 本文 見出し UIラベル
サイズ 16-18px 24-48px 12-14px
ウェイト 400 600-700 500
行間 1.5-1.7 1.1-1.2 1.3-1.4
行長 45-75ch N/A N/A
揃え 左揃え 中央揃え可 左揃え

色彩理論

「色彩は、魂に直接影響を及ぼす力です。」 — Wassily Kandinsky

色は言葉よりも速く伝わります。雰囲気をつくり、注意を導き、意味を示し、ブランド認知を築きます。

60-30-10ルール

バランスの取れたインターフェースに最も信頼できる色の配分です。

┌──────────────────────────────────────────┐
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│ 60% - Dominant (Background)
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░│ 30% - Secondary (Cards, sections)
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░│
│░░░░░▓▓▓▓▓▓▓▓▓▓▓▓██████▓▓▓▓▓▓▓▓▓▓░░░░░░░░│ 10% - Accent (Buttons, links)
└──────────────────────────────────────────┘

カラーパレットの構築

すべてのインターフェースには、用途ごとに意味を持つ次の色が必要です:

:root {
  /* Brand */
  --color-primary: hsl(220, 80%, 50%);
  --color-primary-hover: hsl(220, 80%, 45%);

  /* Semantic */
  --color-success: hsl(142, 76%, 36%);  /* Green - positive */
  --color-warning: hsl(38, 92%, 50%);   /* Amber - caution */
  --color-error: hsl(0, 84%, 60%);      /* Red - danger */

  /* Neutrals */
  --color-background: hsl(0, 0%, 100%);
  --color-surface: hsl(220, 14%, 96%);
  --color-border: hsl(220, 13%, 91%);

  /* Text */
  --color-text: hsl(220, 13%, 13%);
  --color-text-secondary: hsl(220, 9%, 46%);
  --color-text-muted: hsl(220, 9%, 64%);
}

色彩心理

心理効果 UIでの用途
信頼、安定、落ち着き 金融、テクノロジー、企業向け
成長、自然、成功 ヘルスケア、エコ、ポジティブな状態
エネルギー、緊急性、危険 アラート、セール、エラー
オレンジ 温かさ、熱意 CTA、遊び心のあるブランド
楽観、注意 警告、ハイライト
高級感、創造性 プレミアム製品
### ダークモード優先のデザイン(Vercel)
Vercelでは、まずダークモード向けにデザインし、その後でライトモードを派生させます。ダークモードが後回しではなく主要な検討事項になるため、より優れたダークモードのインターフェースを作れます。
/* Design dark first, derive light */
:root {
  /* Dark mode defaults */
  --color-background: hsl(0, 0%, 0%);
  --color-surface: hsl(0, 0%, 7%);
  --color-border: hsl(0, 0%, 15%);
  --color-text: hsl(0, 0%, 93%);
  --color-text-secondary: hsl(0, 0%, 63%);
}

@media (prefers-color-scheme: light) {
  :root {
    --color-background: hsl(0, 0%, 100%);
    --color-surface: hsl(0, 0%, 97%);
    --color-border: hsl(0, 0%, 89%);
    --color-text: hsl(0, 0%, 9%);
    --color-text-secondary: hsl(0, 0%, 40%);
  }
}

使用する場面: 開発者向けツール、メディアアプリ、ダッシュボードなど、ユーザーが長時間利用し、ダークモードによって目の疲れを軽減できるコンテキスト。

アクセシビリティのコントラスト

レベル 通常テキスト 大きなテキスト UIコンポーネント
AA 4.5:1 3:1 3:1
AAA 7:1 4.5:1 N/A
WCAG 2.2 は2025年10月にISO標準(ISO/IEC 40500:2025)となり、フォーカスの可視性、冗長入力、アクセシビリティ対応の認証に関する基準が追加されました。主な追加点は、フォーカスインジケーターが他のコンテンツによって完全に隠れてはならないこと(2.4.11)と、認証が認知機能テストだけに依存してはならないこと(3.3.8)です。W3Cは2024年12月に更新版のWCAG 2.2を公開しており、これは2026年後半までにISO/IEC 40500:2026としてリリースされる見込みです。

WCAG 3.0 はまだ作業草案の段階です。最新改訂版は2026年3月に公開されましたが、WCAG 2.2を置き換えるものではありません。W3Cは、2つの標準が共存するとしています。Accessibility Guidelines Working Groupは、2026年にWCAG 3の予定タイムラインを公開する計画ですが、現時点の作業で目標にすべき標準は引き続きWCAG 2.2です。

ツール: WebAIM Contrast Checker、Chrome DevTools color picker


視覚的階層

「デザインは、ブランドの静かな大使です。」— Paul Rand

視覚的階層は、ユーザーが最初に何を見て、次に何を見て、その後に何を見るかを制御します。階層が明確でないと、ユーザーは情報を探すために労力を使わなければなりません。明確な階層があれば、インターフェースは自然に使いやすく感じられます。

階層をつくる6つのツール

1. サイズ — 大きい要素ほど先に目を引きます

.hero-title { font-size: 3rem; }      /* Dominant */
.section-title { font-size: 1.5rem; } /* Secondary */
.body-text { font-size: 1rem; }       /* Baseline */

2. 太さ — 太字は前に出て、細い文字は後ろに下がって見えます

h1 { font-weight: 700; }
.lead { font-weight: 500; }
p { font-weight: 400; }

3. 色とコントラスト — コントラストが高いほど注意を引きます

.title { color: var(--color-text); }  /* Near black */
.meta { color: var(--color-text-muted); }  /* Gray */

4. 位置 — 重要な位置には意味があります

F-PATTERN (content pages):     Z-PATTERN (landing pages):
████████████████████████      1 ──────────────────► 2
████████                            ↘
████                                     ↘
██                                            ↘
                                   3 ──────────────────► 4

5. 余白 — 孤立させることで重要性が生まれます

.hero { padding: 120px 48px; }  /* Generous space */
.data-table { padding: 12px; }  /* Dense content */

6. 奥行きとエレベーション — 手前に浮き出る要素は注意を引きます

:root {
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
  --shadow-md: 0 4px 6px rgba(0,0,0,0.1);
  --shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
}

.card { box-shadow: var(--shadow-sm); }
.card:hover { box-shadow: var(--shadow-md); }
.modal { box-shadow: var(--shadow-lg); }

応用パターン

共同作業の存在感(Figma): 名前ラベル付きの複数ユーザーカーソル、選択ハイライト、コンポーネントのアウトラインによって、生きたドキュメントが生まれます。共同編集者ごとの色ははっきり区別できますが、視覚的な重みは同じです。どのカーソルも、ほかより「強く」見えることはありません。

控えめなステータスインジケーター(Vercel): デプロイ状況は、割り込むアラートではなく、さりげなく常時表示されるインジケーターで示します。上部の細いカラーバーが状態(ビルド中、デプロイ済み、失敗)を伝え、ワークフローを中断しません。

現実世界のデザインアナロジー(Flighty): フライト進行状況の可視化は、実際の航空計器をなぞっています。高度曲線、速度インジケーター、ゲートマップは、抽象的な進行バーではなく、見慣れた視覚的メタファーを使っています。

目を細めるテスト

デザインを目を細めて見てください。それでも階層が見えますか。見えるなら、強い階層です。


スペーシングとリズム

「余白は空気のようなものです。デザインが呼吸するために必要です。」 — Wojciech Zieliński

スペーシングは、デザインを支える見えない構造です。一貫したスペーシングは視覚的なリズムを生み、要素同士が一貫したシステムの中でまとまっているように感じさせます。

8pxグリッド

8pxグリッドが業界標準になっている理由は次のとおりです。 - 均等に分割できます(8、16、24、32、40、48…) - 一般的な画面密度(1x、1.5x、2x、3x)に対応できます - 計算しなくても一貫したリズムを作れます

:root {
  --space-1: 4px;    /* Tight: icon gaps */
  --space-2: 8px;    /* Compact: inline elements */
  --space-3: 12px;   /* Snug: form fields */
  --space-4: 16px;   /* Default: most gaps */
  --space-6: 24px;   /* Spacious: card padding */
  --space-8: 32px;   /* Section gaps */
  --space-12: 48px;  /* Major sections */
  --space-16: 64px;  /* Page sections */
  --space-20: 80px;  /* Hero spacing */
}

内部スペーシングと外部スペーシング

内部(padding): 要素の内側のスペース 外部(margin): 要素間のスペース

ルール: 関連するグループ内では、通常、内部スペーシングを外部スペーシングより大きくします。

.card {
  padding: 24px;        /* Internal: spacious */
  margin-bottom: 16px;  /* External: less than padding */
}

コンポーネントの余白パターン

カード:

.card { padding: 24px; border-radius: 12px; }
.card-header { margin-bottom: 16px; }
.card-title { margin-bottom: 4px; }  /* Tight to subtitle */

ボタン:

.btn { padding: 12px 24px; border-radius: 8px; }
.btn--sm { padding: 8px 16px; }
.btn--lg { padding: 16px 32px; }
.btn-group { display: flex; gap: 12px; }

フォーム:

.form-row { margin-bottom: 24px; }
.form-label { margin-bottom: 4px; }
.form-help { margin-top: 4px; }
.form-actions { margin-top: 32px; display: flex; gap: 12px; }

余白のクイックリファレンス

コンテキスト 推奨される余白
アイコンとテキストの間 4-8px
ラベルと入力欄の間 4px
フォームグループ間 24px
カードのpadding 20-24px
カードのgap 16-24px
セクションのpadding(モバイル) 48-64px
セクションのpadding(デスクトップ) 80-96px
ボタンのpadding(水平/垂直) 24px / 12px

アニメーションの原則

「アニメーションとは、動く絵の芸術ではなく、描かれた動きの芸術である。」— Norman McLaren

アニメーションはインターフェースに命を吹き込みます。適切に使えば、注意を導き、状態を伝え、感情的なつながりを生み出します。不適切に使えば、ユーザーを苛立たせ、集中を妨げるだけです。

核となる原則

アニメーションは装飾ではなく、必然であるべきです。

良いアニメーション: 1. 静的なデザインでは伝えられないことを伝える 2. 関係性を視覚化して認知負荷を軽減する 3. 自然で予測通りに感じられる 4. 意識されることなく機能する

悪いアニメーション: 1. 「かっこいいから」という理由だけで存在する 2. ユーザーの操作を遅くする 3. それ自体が目立ってしまう 4. 不安やいら立ちを生む

UI における主要原則

1. 予備動作(Anticipation) — これから何が起こるかをユーザーに予感させます。

.button {
  transition: transform 0.1s ease-out;
}

.button:active {
  transform: scale(0.97);  /* Slight press before action */
}

2. フォロースルー(Follow-Through) — スプリングのような余韻を持たせ、動きを自然に完結させます。

.panel {
  transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
withAnimation(.spring(response: 0.4, dampingFraction: 0.7)) {
    isOpen = true
}

3. Ease-In、Ease-Out — 自然界に等速で動くものはありません。

カーブ 使用場面 特徴
ease-out 要素の出現 素早く始まり、ゆるやかに止まる
ease-in 要素の退場 ゆるやかに始まり、素早く去る
ease-in-out 状態の切り替え 全体を通してなめらか
linear ローディングインジケーター 連続的、機械的

4. ステージング(Staging) — 重要なものに注意を向けさせます。グループとして意図的に振り付けられていない限り、一度に動くのは一つだけにしましょう。

5. スタガリング(Staggering) — 要素は一斉にではなく、順を追って表示されるべきです。

.list-item {
  animation: fadeSlideIn 0.3s ease-out both;
}

.list-item:nth-child(1) { animation-delay: 0ms; }
.list-item:nth-child(2) { animation-delay: 50ms; }
.list-item:nth-child(3) { animation-delay: 100ms; }
.list-item:nth-child(4) { animation-delay: 150ms; }

@keyframes fadeSlideIn {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}

タイミングのガイドライン

時間 用途 体感
50〜100ms マイクロインタラクション(ホバー、プレス) 即座のフィードバック
150〜200ms シンプルな状態変化(トグル、選択) きびきびした動き
250〜350ms 中規模のトランジション(パネルスライド、カードフリップ) なめらか
400〜500ms 大きな動き(ページ遷移、モーダル) 落ち着いた印象

パフォーマンス:ゴールデンルール

アニメーションは transformopacity だけに限定しましょう — これらはGPUアクセラレーションが効き、レイアウトの再計算を発生させません。

/* BAD: Animating layout */
.panel { transition: left 0.3s, width 0.3s; }

/* GOOD: Using transform */
.panel { transition: transform 0.3s; }

アニメーションを使わないべき場面

  1. ユーザーが prefers-reduced-motion を有効にしている場合 css @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } }

  2. アニメーションが情報を伝えない場合 — 無意味なスピナーや跳ねる要素

  3. ユーザーが急いでいる場合 — エラー表示、フォームバリデーション、検索結果
  4. 繰り返し操作が遅くなる場合 — キーボードショートカットはアニメーションをスキップすべきです
  5. データがすでに読み込まれている場合 — Bear はコンテンツをプリロードすることでローディング状態をゼロにし、アプリを瞬時に感じさせています。プリロードが可能なら、スケルトンやスピナーは丸ごと省略しましょう。
// Bear's approach: preload so no loading state is needed
struct NoteListView: View {
    @Query var notes: [Note]  // SwiftData loads from disk instantly
    // No loading state, no skeleton, no spinner — data is always there
    var body: some View {
        List(notes) { note in
            NoteRow(note: note)
        }
    }
}

アニメーション クイックリファレンス

:root {
  /* Durations */
  --duration-instant: 0.1s;
  --duration-fast: 0.15s;
  --duration-normal: 0.25s;
  --duration-slow: 0.4s;

  /* Easings */
  --ease-out: cubic-bezier(0.0, 0.0, 0.58, 1.0);
  --ease-in: cubic-bezier(0.42, 0.0, 1.0, 1.0);
  --ease-in-out: cubic-bezier(0.42, 0.0, 0.58, 1.0);
  --ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);
}

インタラクションパターン

「最良のインターフェースは、インターフェースがないことである。」— Golden Krishna

インタラクションパターンは、ユーザーがプロダクトをどのように操作し、ナビゲートし、理解するかを定義するものです。ここで紹介するパターンは、卓越したインタラクションを実現しているプロダクトの研究から抽出されたものです。

ダイレクトマニピュレーション(Framer)

抽象的な概念を具体的にしましょう。Framer はCSSのブレークポイント——抽象的な数値——をドラッグ可能なハンドルに変換しています。レイアウトがリアルタイムで適応していく様子をユーザーは直接確認できます。

/* Breakpoint handle styling */
.breakpoint-handle {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 4px;
  background: var(--accent);
  cursor: col-resize;
  opacity: 0.6;
  transition: opacity 0.15s ease;
}

.breakpoint-handle:hover,
.breakpoint-handle:active {
  opacity: 1;
  width: 6px;
}

使いどころ: 結果が視覚的に表れるあらゆる設定——ドラッグによるリサイズ、カラーピッカー、タイムラインのスクラビングなど。

コンテキストアウェアなインターフェース(Flighty、Figma)

その瞬間に関連する情報だけを表示しましょう。Flighty はフライト追跡に15の異なる状態を使い分けています。Figma のプロパティパネルは、選択したオブジェクトに応じて完全に変化します。

フェーズ(Flighty) ユーザーに表示される内容
24時間前 確認コード、ターミナル情報
空港到着時 ゲート番号、搭乗時刻
飛行中 残り時間、進行状況、到着予定時刻
着陸時 乗り継ぎゲート、移動経路
enum ContextState: CaseIterable {
    case farOut, dayBefore, headToAirport, atAirport
    case atGate, boarding, inFlight, landed, connection

    static func current(for flight: Flight, context: UserContext) -> ContextState {
        // Factor in: time, location, flight status
        // Return the single most relevant state
    }
}

アンチパターン: すべてのコントロールを表示し、関係のないものをグレーアウトする方法。視覚的なノイズを生むだけです。

インテリジェントなアクティベーション(Halide)

ツールはコンテキストを検知して自動的に作動すべきです。Halide のフォーカスルーペはフォーカスをドラッグすると現れ、離すと消えます。トグルボタンは不要です。

struct IntelligentlyActivated<Content: View>: ViewModifier {
    let isInteracting: Bool
    @State private var isVisible = false

    func body(content: Content) -> some View {
        content
            .opacity(isVisible ? 1 : 0)
            .scaleEffect(isVisible ? 1 : 0.95)
            .animation(.easeInOut(duration: 0.2), value: isVisible)
            .onChange(of: isInteracting) { _, newValue in
                if newValue {
                    withAnimation { isVisible = true }
                } else {
                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                        if !isInteracting { isVisible = false }
                    }
                }
            }
    }
}

デュアルモードデザイン(Halide、Warp)

モードの切り替えでは、要素のトグルではなく UI 全体を変化させるべきです。Halide の Auto モードと Manual モードはまったく異なるインターフェースとして設計されています。Warp は4つの入力方法(タイピング、パレット、AI、マウス)を通じてCLIと GUI を橋渡しし、ユーザーを一つのパラダイムに押し込めることなく操作を可能にしています。

構造化されたコンテンツ(Warp、Bear、Craft)

従来は非構造的だったコンテンツに構造を与えましょう。Warp はターミナル出力を個別のブロックに変え、コピー、共有、再実行を可能にしています。Bear ではインライン記述中にノートを整理できます(#tag/subtag)。Craft ではあらゆるブロックがページになれるため、事前定義の階層ではなく、使用から構造が自然に生まれます。

プログレッシブトレーニング(Superhuman)

繰り返しの露出を通じて、速い操作方法をユーザーに教えましょう。Superhuman の Cmd+K パレットは、検索結果の横に常にキーボードショートカットを表示します。一回の使用が、そのままマイクロレッスンになるのです。

/* Always show shortcut alongside command name */
.command-result {
  display: flex;
  justify-content: space-between;
  padding: 8px 12px;
}

.command-shortcut {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--text-muted);
  background: var(--bg-subtle);
  padding: 2px 6px;
  border-radius: 4px;
}

アンチパターン: 機能を説明するチュートリアルモーダル。説明は忘れられますが、実践は記憶に残ります。


AIインターフェースのパターン

「優れたAIインターフェースは、機械の処理過程を見えるようにし、機械の出力を検証できるようにします。」

AIインターフェースには独自の課題があります。ユーザーは出力を予測できず、見ただけでは正確性を検証できません。また、システムが動作中なのか壊れているのかを判断しにくいこともよくあります。

核心的な問題

従来型ソフトウェア AIソフトウェア
出力は予測可能です 出力は変動します
エラーは明らかです エラーももっともらしく見えます
ユーザーはテストで検証します ユーザーは出典を確認して検証します
読み込み = 待機 読み込み = 作業中(見せる)
デフォルトで信頼されます 信頼は獲得する必要があります
### Citation-Forward Design(Perplexity)
すべての事実に基づく主張は、その出典にリンクしている必要があります。Perplexityは、すべての主張にインライン引用[1]を埋め込み、ホバー時のプレビューと常に表示される出典パネルを備えています。
.citation-marker {
  position: relative;
  color: var(--accent);
  cursor: pointer;
  font-size: 0.8em;
  vertical-align: super;
}

.citation-preview {
  position: absolute;
  bottom: 100%;
  left: 50%;
  transform: translateX(-50%);
  width: 280px;
  padding: 12px;
  background: var(--bg-elevated);
  border: 1px solid var(--border);
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}

アンチパターン: 追跡可能な出典なしに主張を生成するAIインターフェースです。モデルが引用できない内容は、インターフェース側で警告するべきです。

ストリーミングフェーズインジケーター(Perplexity)

AIが単に動作中であることだけでなく、何をしているのかをユーザーに示します。汎用的なスピナーをフェーズインジケーターに置き換えましょう。「検索中…」→「4件のソースを読んでいます…」→「回答を書いています…」

.phase-indicator {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 12px;
  background: color-mix(in srgb, var(--phase-color) 10%, transparent);
  border-radius: 16px;
  font-size: 13px;
  color: var(--phase-color);
  transition: all 0.3s ease;
}

.loading-dots span {
  width: 4px;
  height: 4px;
  background: currentColor;
  border-radius: 50%;
  animation: pulse 1.4s ease-in-out infinite;
}

エラーの透明性

AIが失敗したり不確かな場合は、自信ありげな文言で隠さず、はっきり示します。

状況 悪いパターン 良いパターン
信頼度が低い 断定的に述べる 「確信はありませんが、…」とし、控えめなスタイルにする
根拠が見つからない 文章を捏造する 「この主張の根拠は見つかりませんでした」
根拠同士が矛盾している どれか1つを黙って選ぶ 両方を示し、矛盾している点を強調する
情報が古い 最新情報として提示する 「[日付]時点では…」とし、新しさを示す表示を添える
重要な洞察: ユーザーは、不確実さを正直に示すAIなら許容してくれます。自信満々に間違えるAIは許容してくれません。

エージェント型ワークフローのエビデンス

AI エージェントには、努力を語るだけでなく、作業を証明するインターフェース状態が必要です。優れたエージェント型ワークフローでは、進捗がチェックポイントを通じて見えるようになります。計画が承認された、ソースを収集した、編集を適用した、テストを実行した、レビュー待ちである、リリースがブロックされている、または準備できている、といった状態です。

エージェント状態 インターフェースパターン 重要な理由
計画 明確な目標と受け入れ基準 エージェントが成果ではなく作業量を最適化してしまうのを防ぎます
探索 信頼度と新しさを添えたソース一覧 検証済みの事実と作業上の仮定をユーザーが区別できます
実行 チェックポイントに紐づいた変更ファイルの概要 トランスクリプト全体を読まなくても編集内容をレビューできます
検証 テスト、ルート、スクリーンショット、またはランタイムの証拠 証明と見せかけの自信を切り分けます
リリース 承認、デプロイ、ネイティブレビューの状態 緑色のローカルチェックの裏に未完了の作業が隠れたまま公開されるのを防ぎます
アンチパターン: 複数ステップのエージェント作業に対して、1つの「完了」状態だけを用意すること。複雑な作業には、何が変わったのか、何がそれを証明したのか、何を拒否したのか、そしてどこに人間の判断がまだ必要なのかを示す、見える形の管理履歴が必要です。

Dieter Rams: 10の原則

「より少なく、しかしより良く。」 — Dieter Rams

Dieter Ramsは、20世紀で最も影響力のあるインダストリアルデザイナーです。1961年から1995年までBraunでデザイン責任者を務め、数十年後の今も色あせない製品を生み出しました。その仕事は、Appleのデザイン言語に直接的な影響を与えました。

良いデザインの10原則

1. 良いデザインは革新的です 模倣してはいけません。進化する技術に、革新的なデザインを組み合わせましょう。

2. 良いデザインは製品を役立つものにします すべての要素に目的が必要です。形は機能に従います。

3. 良いデザインは美しいものです 美しさは表面的なものではなく、本質的なものです。毎日使う製品は、私たちのウェルビーイングに影響します。

4. 良いデザインは製品を理解しやすくします ユーザーが説明書を必要としない状態が理想です。インターフェース自体が使い方を教えてくれます。

5. 良いデザインは控えめです デザインは圧倒するのではなく、支えるべきものです。主役はユーザーのコンテンツであり、UIではありません。

/* Obtrusive: UI competes with content */
.editor {
  background: linear-gradient(135deg, purple, blue);
  border: 3px dashed gold;
}

/* Unobtrusive: UI recedes, content shines */
.editor {
  background: var(--color-background);
  border: 1px solid var(--color-border);
}

6. 良いデザインは誠実です ダークパターンを使わないでください。過度な約束は避けましょう。制約は隠さず伝えます。

7. 良いデザインは長く使えます すぐに古くなるトレンドは避けましょう。流行よりも普遍性を優先します。

TRENDY (will date):           TIMELESS:
- Extreme glassmorphism       - Clean typography
- Neon colors, glitch effects - Subtle elevation
- Aggressive gradients        - Neutral palette with considered accent

8. 良いデザインは最後の細部まで徹底されています 恣意的であってよいものはありません。読み込み状態、空の状態、エラー状態まで、すべてデザインします。

9. 良いデザインは環境に配慮しています パフォーマンスは環境に関わります。ユーザーの注意を尊重しましょう。効率的なコードを使います。

10. 良いデザインは可能な限り少ないデザインです 必要でないものはすべて取り除きます。最高のデザインは目に見えないものです。


Web Patterns 2026

現代のWebデザインでは、ネイティブのCSS機能を活用することで、多くの場合にJavaScriptが不要になります。2025年から2026年にかけて、anchor positioning、スクロール駆動アニメーション、@starting-styleが本番ブラウザーで使えるようになりました。

コンテナクエリ

viewportではなく、コンテナのサイズに基づいてコンポーネントのサイズを決めます。

.card-grid {
  container-type: inline-size;
  container-name: card-grid;
}

.card {
  display: grid;
  gap: 16px;
  padding: 20px;
}

@container card-grid (min-width: 400px) {
  .card {
    grid-template-columns: auto 1fr;
  }
}

@container card-grid (min-width: 600px) {
  .card {
    padding: 32px;
    gap: 24px;
  }
}

:has() セレクター

子要素に基づいて親要素を選択できます。以前はJavaScriptなしでは不可能でした。

/* Card with image gets different padding */
.card:has(img) {
  padding: 0;
}

.card:has(img) .card-content {
  padding: 20px;
}

/* Form group with error */
.form-group:has(.input:invalid) .form-label {
  color: var(--color-error);
}

/* Highlight navigation when on that page */
.nav-item:has(a[aria-current="page"]) {
  background: var(--color-surface);
}

CSS のネスト

プリプロセッサなしでネイティブにネストできます。

.card {
  background: var(--color-surface);
  border-radius: 12px;
  padding: 24px;

  & .card-title {
    font-size: 1.25rem;
    font-weight: 600;
    margin-bottom: 8px;
  }

  & .card-body {
    color: var(--color-text-secondary);
    line-height: 1.6;
  }

  &:hover {
    box-shadow: var(--shadow-md);
  }

  @media (min-width: 768px) {
    padding: 32px;
  }
}

HTMX 連携

重い JavaScript フレームワークを使わずに、サーバー主導のインタラクティブ性を実現します。

<!-- Load content on click -->
<button hx-get="/api/more-items"
        hx-target="#item-list"
        hx-swap="beforeend"
        hx-indicator="#loading">
  Load More
</button>

<!-- Form with inline validation -->
<form hx-post="/api/contact"
      hx-target="#form-response"
      hx-swap="outerHTML">
  <input type="email" name="email"
         hx-post="/api/validate-email"
         hx-trigger="blur"
         hx-target="next .error" />
  <span class="error"></span>
</form>

Anchor Positioning

ある要素を別の要素に対して配置する、ネイティブな CSS の位置指定です。JavaScript は不要です。ツールチップ、ポップオーバー、ドロップダウンメニューがトリガーに追従します。

/* Anchor an element to another */
.trigger {
  anchor-name: --my-trigger;
}

.tooltip {
  position: fixed;
  position-anchor: --my-trigger;
  top: anchor(bottom);
  left: anchor(center);
  translate: -50% 8px;
}

スクロール駆動アニメーション

アニメーションの進行をスクロール位置に連動させます。JavaScriptなしで、読み進めた位置を示すインジケーター、パララックス効果、リビールシーケンスを実現できます。

/* Reading progress bar */
.progress-bar {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 3px;
  background: var(--color-primary);
  transform-origin: left;
  animation: progress linear;
  animation-timeline: scroll();
}

@keyframes progress {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

@starting-style

DOMに追加される要素の初期スタイルを定義します。これにより、JavaScriptなしで、CSSのみのenterアニメーションを実現できます。

.card {
  opacity: 1;
  transform: translateY(0);
  transition: opacity 0.3s ease, transform 0.3s ease;

  @starting-style {
    opacity: 0;
    transform: translateY(10px);
  }
}

ダークモードを正しく実装する

単純な色反転ではなく、ダークモード専用にデザインし直しましょう。

@media (prefers-color-scheme: dark) {
  :root {
    /* Neutrals */
    --color-background: hsl(220, 13%, 10%);
    --color-surface: hsl(220, 13%, 15%);
    --color-surface-elevated: hsl(220, 13%, 18%);
    --color-border: hsl(220, 13%, 23%);

    /* Text (inverted) */
    --color-text: hsl(220, 9%, 93%);
    --color-text-secondary: hsl(220, 9%, 70%);
    --color-text-muted: hsl(220, 9%, 55%);

    /* Adjust saturation for dark mode */
    --color-primary: hsl(220, 80%, 60%);
    --color-success: hsl(142, 70%, 45%);
    --color-error: hsl(0, 80%, 65%);

    /* Shadows in dark mode need adjustment */
    --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
    --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
  }
}

ダークモードの原則: - 広い面積にはサチュレーションを下げる - アクセントカラーの明度を上げる - シャドウを強める(コントラストがより必要になるため) - 後付けではなく、意図的にダークモードを設計する


Figma 抽出ワークフロー

デザインファイルをプロダクションコードに変換するには、デザイントークン(カラー、タイポグラフィ、スペーシング、エフェクト)を体系的に抽出する必要があります。これらのトークンがデザイン言語を定義します。

Figma Variables のエクスポート

Figma のネイティブ Variables 機能が、最もクリーンな抽出方法を提供します。

エクスポート手順: 1. Figma ファイルを開く → Local Variables パネル 2. コレクションメニューをクリック →「Export to JSON」を選択 3. figma-variables.json として保存

JSON トークン構造:

{
  "colors": {
    "primitive": {
      "blue-500": { "value": "#3b82f6", "type": "color" },
      "blue-600": { "value": "#2563eb", "type": "color" }
    },
    "semantic": {
      "primary": { "value": "{colors.primitive.blue-500}", "type": "color" },
      "primary-hover": { "value": "{colors.primitive.blue-600}", "type": "color" }
    }
  },
  "spacing": {
    "1": { "value": "4px", "type": "spacing" },
    "2": { "value": "8px", "type": "spacing" },
    "4": { "value": "16px", "type": "spacing" }
  }
}

トークンから CSS への変換

CSS カスタムプロパティ:

:root {
  /* Primitive colors (direct values) */
  --color-blue-50: #eff6ff;
  --color-blue-100: #dbeafe;
  --color-blue-500: #3b82f6;
  --color-blue-600: #2563eb;
  --color-blue-900: #1e3a8a;

  /* Semantic colors (reference primitives) */
  --color-primary: var(--color-blue-500);
  --color-primary-hover: var(--color-blue-600);
  --color-background: var(--color-white);
  --color-surface: var(--color-gray-50);

  /* Spacing (8px grid) */
  --space-1: 0.25rem;  /* 4px */
  --space-2: 0.5rem;   /* 8px */
  --space-4: 1rem;     /* 16px */
  --space-6: 1.5rem;   /* 24px */
  --space-8: 2rem;     /* 32px */

  /* Typography */
  --font-size-sm: 0.875rem;
  --font-size-base: 1rem;
  --font-size-lg: 1.125rem;
  --line-height-tight: 1.25;
  --line-height-normal: 1.5;

  /* Effects */
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
  --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 12px;
}

ダークモードトークン:

@media (prefers-color-scheme: dark) {
  :root {
    --color-background: var(--color-gray-900);
    --color-surface: var(--color-gray-800);
    --color-text: var(--color-gray-100);
    --color-text-secondary: var(--color-gray-400);

    /* Adjusted shadows for dark mode */
    --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
    --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
  }
}

トークンから SwiftUI への変換

Color 拡張:

import SwiftUI

extension Color {
    // MARK: - Primitive Colors
    static let blue50 = Color(hex: "eff6ff")
    static let blue500 = Color(hex: "3b82f6")
    static let blue600 = Color(hex: "2563eb")

    // MARK: - Semantic Colors
    static let brandPrimary = Color.blue500
    static let brandPrimaryHover = Color.blue600

    // MARK: - Surface Colors
    static let surfaceBackground = Color(light: .white, dark: Color(hex: "0f172a"))
    static let surfaceElevated = Color(light: Color(hex: "f8fafc"), dark: Color(hex: "1e293b"))
}

extension Color {
    init(hex: String) {
        // Standard hex parsing implementation
    }

    init(light: Color, dark: Color) {
        self.init(UIColor { traits in
            traits.userInterfaceStyle == .dark ? UIColor(dark) : UIColor(light)
        })
    }
}

スペーシング定数:

enum Spacing {
    static let xs: CGFloat = 4    // --space-1
    static let sm: CGFloat = 8    // --space-2
    static let md: CGFloat = 16   // --space-4
    static let lg: CGFloat = 24   // --space-6
    static let xl: CGFloat = 32   // --space-8
}

// Usage
VStack(spacing: Spacing.md) {
    // ...
}
.padding(Spacing.lg)

デザイナーハンドオフチェックリスト

デザイナーがエクスポートすべきもの:

アセットタイプ フォーマット 備考
カラー Variables JSON ライト+ダークモードを含む
タイポグラフィ スタイルエクスポート フォント、サイズ、ウェイト、line-height
スペーシング Variables JSON 基本単位を明記
アイコン SVG アウトライン化、単色
画像 PNG @2x/@3x または WebP 圧縮済み
コンポーネント Figma リンク 実装時の参照用

品質ゲート基準:

  • [ ] すべてのカラーが Variables として定義されている(ハードコードされた hex 値なし)
  • [ ] タイポグラフィが定義済みのテキストスタイルを使用している
  • [ ] スペーシングがグリッドシステムに準拠している(8px ベース)
  • [ ] ダークモードのバリアントが提供されている
  • [ ] インタラクティブステート(hover、active、disabled)が明記されている
  • [ ] レスポンシブブレークポイントが注釈されている
  • [ ] アクセシビリティ要件が記載されている(コントラスト比)

開発者が受け取るもの:

  1. トークンファイル(プラットフォームに応じて JSON/CSS/Swift)
  2. 寸法付きのコンポーネント仕様
  3. 必要なフォーマットのアセットエクスポート
  4. インタラクションドキュメント(ステート、アニメーション)
  5. アクセシビリティに関する注釈

クイックリファレンス表

Gestalt の原則

原則 ルール 用途
近接 関連するもの=近くに配置 フォーム、セクション
類似 同じ見た目=同じ機能 ボタン、カード
図と地 レイヤーの明確な分離 モーダル、カード
連続 線に沿って視線を導く タイムライン、整列
閉合 脳が形を補完する アイコン、スクロールヒント

タイポグラフィ

要素 サイズ ウェイト 行間
本文 16px 400 1.5-1.7
見出し 24-48px 600-700 1.1-1.2
UI ラベル 12-14px 500 1.3-1.4
キャプション 12px 400 1.4

カラーの役割

役割 ライトモード ダークモード
背景 #ffffff #0f172a
サーフェス #f4f5f7 #1e293b
ボーダー #e4e6ea #334155
テキスト #1a1a2e #f1f5f9
ミュートテキスト #6b7280 #94a3b8
プライマリ #3b82f6 #60a5fa
成功 #22c55e #4ade80
エラー #ef4444 #f87171

スペーシングスケール

トークン 用途
–space-1 4px アイコン間のギャップ
–space-2 8px インライン要素
–space-4 16px デフォルトのギャップ
–space-6 24px カードのパディング
–space-8 32px セクション間のギャップ
–space-16 64px ページセクション

デザインチェックリスト

インターフェースをリリースする前に、以下を確認してください。

Gestalt

  • [ ] 関連する要素が、無関係な要素よりも近くに配置されている(近接)
  • [ ] 同じ機能には同じスタイルが適用されている(類似)
  • [ ] 前景と背景が明確に分離されている(図と地)
  • [ ] レイアウト内で視線が自然に流れる(連続)

タイポグラフィ

  • [ ] ベースフォントサイズが 16px 以上である
  • [ ] 本文の行間が 1.5 以上である
  • [ ] 1行の文字数が 75 文字以内である
  • [ ] 階層が明確である(3段階が識別可能)
  • [ ] 一貫したスケールが使用されている

カラー

  • [ ] すべてのテキストが 4.5:1 のコントラスト比を満たしている(WCAG AA)
  • [ ] 色だけに頼らず、アイコンやラベルも併用している
  • [ ] ダークモードが意図的に設計されている
  • [ ] 60-30-10 の配色比率に従っている

ビジュアル階層

  • [ ] 最も重要な要素が一目で特定できる
  • [ ] 意図した順序で視線が流れる
  • [ ] セクションごとに明確な CTA が1つある
  • [ ] タイプスケールが一貫している

スペーシング

  • [ ] すべてのスペーシングが定義済みのスケールを使用している(マジックナンバーなし)
  • [ ] カードやコンポーネントのパディングが統一されている
  • [ ] モバイルでのスペーシングが快適である
  • [ ] グリッドの整列が一貫している(8px ベース)

インタラクション

  • [ ] ツールの使い方を意識せずに目的を達成できるか
  • [ ] UI が現在のコンテキストに適応しているか
  • [ ] ツールは必要なときだけ表示されているか
  • [ ] 繰り返し使うことで、より速い操作方法を学べるか

AI インターフェース

  • [ ] すべての事実に基づく主張に追跡可能なソースがあるか
  • [ ] ストリーミング中はスピナーだけでなく、処理フェーズが表示されるか
  • [ ] エラー状態が隠されず、透明に表示されるか
  • [ ] 信頼度の低い出力が視覚的に区別されているか

Dieter Rams チェック

  • [ ] 何か取り除けるものはないか
  • [ ] すべての要素が機能を果たしているか
  • [ ] 5年後に古く見えないか
  • [ ] すべてのステートをデザインしたか

リソース

書籍: - As Little Design as Possible — Sophie Lovell 著(Dieter Rams について) - The Elements of Typographic Style — Robert Bringhurst 著

ツール: - WebAIM Contrast Checker - Type Scale Generator - Figma Tokens Studio — デザイントークン管理ツール

デザインシステム: - Apple HIG - Material Design 3 - Radix UI - shadcn/ui


デザインチェックリスト

インターフェースを公開する前に確認しましょう。

Gestalt

  • [ ] 関連する要素は、関連しない要素より近くに配置されています(近接)
  • [ ] 似た機能には似たスタイルが使われています(類似)
  • [ ] 前景と背景が明確に分かれています(図と地)
  • [ ] 視線がレイアウト内を自然に流れます(連続)

タイポグラフィ

  • [ ] ベースのフォントサイズは少なくとも16pxです
  • [ ] 本文テキストの行間は1.5以上です
  • [ ] 1行の長さは75文字未満です
  • [ ] 階層が明確です(3段階を区別できます)
  • [ ] 全体で一貫したスケールが使われています

カラー

  • [ ] すべてのテキストが4.5:1のコントラストを満たしています(WCAG AA)
  • [ ] 色だけが唯一の手がかりになっていません(アイコンやラベルも使います)
  • [ ] ダークモードが意図を持ってデザインされています
  • [ ] 60-30-10の配分に従っています

視覚階層

  • [ ] 最も重要な要素を1つ特定できます
  • [ ] 視線が意図した順序で流れます
  • [ ] 各セクションに明確なCTAが1つあります
  • [ ] タイプスケールに一貫性があります

余白

  • [ ] すべての余白が定義済みのスケールを使っています(マジックナンバーなし)
  • [ ] カードやコンポーネントのpaddingに一貫性があります
  • [ ] モバイルの余白が快適です
  • [ ] グリッドの整列に一貫性があります(8pxベース)

インタラクション

  • [ ] ユーザーはツールを意識せずに目的を達成できますか?
  • [ ] UIは現在のコンテキストに適応していますか?
  • [ ] ツールは必要なときだけ表示されていますか?
  • [ ] 繰り返し使うことで、より速い方法を学べますか?

AIインターフェース

  • [ ] すべての事実に基づく主張に、追跡可能な出典がある
  • [ ] Streamingではスピナーだけでなく、処理のフェーズが示される
  • [ ] エラー状態は隠されず、透明性がある
  • [ ] 信頼度の低い出力は、視覚的に区別されている

Dieter Rams チェック

  • [ ] 取り除けるものはありますか?
  • [ ] すべての要素が機能に役立っていますか?
  • [ ] これは5年後に古く感じられますか?
  • [ ] すべての状態をデザインしましたか?

リソース

書籍: - As Little Design as Possible by Sophie Lovell (Dieter Rams) - The Elements of Typographic Style by Robert Bringhurst

ツール: - WebAIM Contrast Checker - Type Scale Generator - Figma Tokens Studio — デザインtokensの管理

デザインシステム: - Apple HIG - Material Design 3 - Radix UI - shadcn/ui


デザイン事例研究

盗む価値のあるパターンと原則を記録した、48の優れた製品の深掘りです。

開発者向けツール & AI

製品 主な貢献
Figma マルチプレイヤーのプレゼンス、コンテキスト認識パネル
Warp ブロックベースのターミナル、CLIとGUIの橋渡し
Framer ビジュアルなレスポンシブデザイン、プロパティコントロール
Vercel ダークモードの完成度、環境に溶け込むステータス
Linear 楽観的UI(Optimistic UI)、キーボード優先のワークフロー
Raycast 拡張機能システム、クイックアクション
Stripe ドキュメントの完成度、APIデザイン
Perplexity 引用を前面に出したAI、ストリーミングのフェーズ
Obsidian ローカルファーストな構成性、ナレッジグラフのインターフェース
### Appleネイティブ & クリエイティブツール
製品 主な貢献
--------- ------------------
Flighty 15のスマート状態、Live Activities、データ可視化
Halide インテリジェントな起動、ジェスチャーコントロール
Bear タイポグラフィ優先、インラインタグ付け
Craft ネイティブ優先のクロスプラットフォーム、ネストされたページ
Things 先送り日付、クイック入力パターン
Darkroom 没入感のあるダークUI、写真優先の編集
Procreate ジェスチャー優先のクリエイティブツール
Overcast インターフェースデザインとしての見えない音声エンジニアリング
Camo プロ向け動画制作UI
Ivory タイムラインの作り込み、遊び心のある精度
Anybox プラットフォームネイティブな透明性
Drafts テキスト優先のキャプチャの明快さ
Notion Calendar カレンダーの精度、ワークスペース統合
### 生産性、ナレッジ、金融
プロダクト 主な貢献
--------- ------------------
Superhuman 100msルール、コマンドパレットのトレーニング、練習型オンボーディング
Notion ブロックシステム、スラッシュコマンド
Arc Spaces、分割ビュー、コマンドバー
Todoist 温かみのあるミニマリズム、最大限に抑制された表現
Amie 楽しさのある生産性、温かみのあるミニマリズム
Loom 親しみやすい非同期動画のプロフェッショナル感
Pitch 大胆なプレゼンテーションデザイン言語
Readwise Reader 深い読書のための道具立て、コズミックなブランディング
Copilot Money 映画的な金融データ可視化
1Password 摩擦のないセキュリティ
Mercury 映画的で洗練されたバンキング
### コンシューマー、ソーシャル、信頼
プロダクト 主な貢献
--------- ------------------
Spotify 色、感情、スケール
Duolingo デザイン言語としてのゲーミフィケーション
Signal シンプルさによるセキュリティ
Airbnb マーケットプレイス規模での信頼
Bluesky アルゴリズムの透明性
Letterboxd ソーシャルオブジェクトとしての映画
Strava ソーシャル通貨としてのGPSデータ
Apple Music 編集の声、空間オーディオ
Headspace インターフェース戦略としての静けさ
Zomato 個性を軸にしたフードUX
### フィジカル、ゲーム、アクセシビリティ
プロダクト 主な貢献
--------- ------------------
Balatro フィードバックループ、ゲームフィールのシステム
Rivian 冒険的な写真表現と記念碑的なタイポグラフィ
Teenage Engineering 美的アイデンティティとしての制約
OKO オーディオハプティックアクセシビリティ
CARROT Weather ユーティリティアプリの差別化要因としての個性

このガイドは実践を通じて育っていきます。デザイン原則は時代を超えるものですが、その応用はテクノロジーと理解の進化に合わせて変わっていきます。