ソフトウェアエンジニアのためのデザイン原則
ソフトウェアエンジニアのためのデザイン原則:完全ガイド
2026年2月9日更新
2026年2月アップデート: 2つの新セクションを追加しました—インタラクションパターン(Framer、Flighty、Halide、Warp、Bear、Craft、Superhumanの研究から導き出した8つのパラダイム)とAIインターフェースパターン(Perplexityから学んだ引用優先デザイン、ストリーミングフェーズ、エラー透明性)。Webパターンを2026年版に更新し、アンカーポジショニング、スクロール駆動アニメーション、@starting-styleを追加しました。アクセシビリティについてはWCAG 2.2のISO標準化を反映しています。16の優れたプロダクトの詳細な分析はデザインスタディをご覧ください。
私はソフトウェアを開発しながら何年もデザインを研究してきました。Dieter Ramsのような巨匠たちの原則を吸収し、Linear、Stripe、Raycastといったプロダクトのインターフェースを分析してきました。このガイドは、自分のソフトウェアの見た目と使い心地に本気で向き合い始めたときに「こんなリファレンスがあれば」と思っていたものを、包括的にまとめたものです。
デザインは装飾ではありません。コミュニケーションです。すべてのピクセルが機能、階層、意味を伝えています。アマチュアに感じるソフトウェアとプロフェッショナルに感じるソフトウェアの違いは、これらの原則を理解し、一貫して適用できるかどうかにあります。
このガイドは、すでにコードが書けることを前提としています。ここで学ぶのは「見る力」です—なぜあるインターフェースは自然に感じられ、別のインターフェースは混沌として感じるのか。そしてさらに重要なのは、前者をどう作るかということです。
目次
Part 1:基礎
Part 2:インタラクションとAI
Part 3:デザイン哲学
Part 4:実装
Part 5:リファレンス
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)といった要件が含まれています。
ツール: WebAIM Contrast Checker、Chrome DevTools カラーピッカー
ビジュアルヒエラルキー
「デザインはブランドの静かなる大使である」— 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 |
| カード間の間隔 | 16-24px |
| セクションpadding(モバイル) | 48-64px |
| セクションpadding(デスクトップ) | 80-96px |
| ボタンpadding(水平/垂直) | 24px / 12px |
アニメーションの原則
“Animation is not the art of drawings that move but the art of movements that are drawn.” — 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 | 大きな動き(ページ遷移、モーダル) | 落ち着いた印象 |
パフォーマンス:ゴールデンルール
アニメーションは transform と opacity だけに限定しましょう — これらはGPUアクセラレーションが効き、レイアウトの再計算を発生させません。
/* BAD: Animating layout */
.panel { transition: left 0.3s, width 0.3s; }
/* GOOD: Using transform */
.panel { transition: transform 0.3s; }
アニメーションを使わないべき場面
-
ユーザーが
prefers-reduced-motionを有効にしている場合css @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; } } -
アニメーションが情報を伝えない場合 — 無意味なスピナーや跳ねる要素
- ユーザーが急いでいる場合 — エラー表示、フォームバリデーション、検索結果
- 繰り返し操作が遅くなる場合 — キーボードショートカットはアニメーションをスキップすべきです
- データがすでに読み込まれている場合 — 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);
}
インタラクションパターン
“The best interface is no interface.” — 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ソフトウェア |
|---|---|
| 出力が予測可能 | 出力が変動する |
| エラーが明白 | エラーがもっともらしく見える |
| テストで検証 | ソースの確認で検証 |
| ローディング=待機 | ローディング=処理中(見せるべき) |
| デフォルトで信頼 | 信頼は獲得するもの |
引用ファーストデザイン(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が失敗したり不確実な場合は、それを明確に示すべきです。自信ありげなテキストの裏に隠してはなりません。
| 状況 | 悪いパターン | 良いパターン |
|---|---|---|
| 確信度が低い | 自信を持って述べる | 「確実ではありませんが…」と控えめなスタイルで表示 |
| ソースが見つからない | テキストを捏造する | 「この主張のソースは見つかりませんでした」 |
| ソースが矛盾する | 一方を黙って採用する | 矛盾を強調して両方を表示 |
| 情報が古い | 最新のものとして提示する | 「[日付]時点…」と鮮度インジケーターを表示 |
重要な知見: 不確実性に正直なAIをユーザーは許容します。自信満々に間違うAIは許容されません。
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パターン2026
モダンなWebデザインは、多くの場面でJavaScriptを不要にするネイティブCSS機能を活用しています。2025〜2026年にかけて、アンカーポジショニング、スクロール駆動アニメーション、@starting-styleがプロダクションブラウザで利用可能になりました。
Container Queries
ビューポートではなく、コンテナのサイズに基づいてコンポーネントをサイジングできます。
.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>
アンカーポジショニング
ある要素を別の要素に対して相対的に配置するネイティブ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のみのエンターアニメーションが実現できます。
.card {
opacity: 1;
transform: translateY(0);
transition: opacity 0.3s ease, transform 0.3s ease;
@starting-style {
opacity: 0;
transform: translateY(10px);
}
}
デザイントークンシステム
アプリケーション全体の一貫性を保つための完全なトークンシステムです。
:root {
/* Colors */
--color-text: #1a1a1a;
--color-text-secondary: #666666;
--color-text-muted: #999999;
--color-background: #ffffff;
--color-surface: #f8f9fa;
--color-surface-elevated: #ffffff;
--color-border: #e5e7eb;
--color-primary: #3b82f6;
--color-primary-hover: #2563eb;
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
/* Typography */
--font-sans: system-ui, -apple-system, sans-serif;
--font-mono: "SF Mono", Consolas, monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
--text-3xl: 2rem;
--leading-tight: 1.25;
--leading-normal: 1.5;
--leading-relaxed: 1.75;
/* Spacing (8px base) */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-3: 0.75rem; /* 12px */
--space-4: 1rem; /* 16px */
--space-6: 1.5rem; /* 24px */
--space-8: 2rem; /* 32px */
--space-12: 3rem; /* 48px */
--space-16: 4rem; /* 64px */
/* Borders */
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-full: 9999px;
/* Shadows */
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
/* Transitions */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
--duration-fast: 100ms;
--duration-normal: 200ms;
}
ダークモードを正しく実装する
単純な色反転ではなく、ダークモード専用にデザインし直しましょう。
@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)が明記されている
- [ ] レスポンシブブレークポイントが注釈されている
- [ ] アクセシビリティ要件が記載されている(コントラスト比)
開発者が受け取るもの:
- トークンファイル(プラットフォームに応じて JSON/CSS/Swift)
- 寸法付きのコンポーネント仕様
- 必要なフォーマットのアセットエクスポート
- インタラクションドキュメント(ステート、アニメーション)
- アクセシビリティに関する注釈
クイックリファレンス表
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
デザインスタディ
16の優れたプロダクトを深く掘り下げ、取り入れる価値のあるパターンと原則を記録しています。
開発者ツール
| プロダクト | 主な貢献 |
|---|---|
| Figma | マルチプレイヤープレゼンス、コンテキスト対応パネル |
| Warp | ブロックベースのターミナル、CLIとGUIの橋渡し |
| Framer | ビジュアルレスポンシブデザイン、プロパティコントロール |
| Vercel | 卓越したダークモード、アンビエントステータス |
| Linear | Optimistic UI、キーボードファーストのワークフロー |
| Raycast | 拡張システム、クイックアクション |
iOSネイティブ(Apple Design Award受賞作品)
| プロダクト | 主な貢献 |
|---|---|
| Flighty | 15のスマートステート、Live Activities、データビジュアライゼーション |
| Halide | インテリジェントアクティベーション、ジェスチャーコントロール |
| Bear | タイポグラフィファースト、インラインタグ付け |
| Craft | ネイティブファーストのクロスプラットフォーム、ネストされたページ |
| Things | 日付の延期機能、クイックエントリーパターン |
プロダクティビティ & AI
| プロダクト | 主な貢献 |
|---|---|
| Superhuman | 100msルール、コマンドパレットのトレーニング、実践型オンボーディング |
| Perplexity | 引用を前面に出したAI、ストリーミングフェーズ |
| Notion | ブロックシステム、スラッシュコマンド |
| Arc | スペース、スプリットビュー、コマンドバー |
| Stripe | 卓越したドキュメンテーション、APIデザイン |
このガイドは実践を通じて成長していきます。デザイン原則は普遍的なものですが、その応用はテクノロジーと理解の深化とともに進化し続けます。