Skip to main content

jamjam UI/UX ガイドライン

Claude CodeがUI実装を迷わず進められるための実践的ガイドライン


1. 設計原則(優先順位付き)

以下の順序で設計判断を行う。上位が下位より優先される。

優先度原則説明
1低遅延の維持UI操作がオーディオ処理をブロックしない。UIスレッドとオーディオスレッドは完全分離
2演奏中の安定性演奏中にモーダル表示しない。自動設定切り替え禁止。ユーザーの意図しないUI変更を禁止
31クリック開始セッション開始まで最短3ステップ以内。プリセット選択のみで動作
4専門用語の排除一般ユーザーが理解できる言葉のみ。技術詳細は折りたたみの中
5視線移動の最小化重要情報は上部固定。演奏中に必要な情報は1画面に収める
6フレンドリーなデザイン明るい色、丸み、親しみやすいアイコン。威圧的でない

2. ターゲットユーザー

  • 技術レベル: 一般ユーザー(Zoom/Discordが使える程度)
  • 前提知識: 専門用語(ASIO、レイテンシー、ジッターバッファ等)を知らない
  • 利用環境: ヘッドフォン使用(スピーカー使用時はエコー警告を表示)

3. 用語ガイドライン

3.1 専門用語→平易な表現

専門用語表示(日本語)表示(英語)使用場面
Latency / RTT遅延Delayステータス、詳細設定
Jitterゆらぎ / 不安定さFluctuation詳細情報のみ
Jitter BufferバッファBuffer詳細設定のみ
Packet Loss接続の安定性Connection stability警告表示時
Sample Rate音質(標準/高音質)Quality設定画面
Frame Size反応速度(速い/標準)Responsiveness設定画面
Codec圧縮方式Compression詳細設定のみ
PCM非圧縮 / 高音質Uncompressedプリセット説明
Opus圧縮 / 通常Compressedプリセット説明
FECエラー補正Error correction詳細設定のみ
DTLS暗号化Encryption詳細設定のみ

3.2 禁止表現

  • 「高速」「低遅延」「高品質」(数値や相対比較で表現する)
  • 「エラーが発生しました」のみ(原因と対処法を必ず添える)
  • 「不明なエラー」(具体的な状況を表示する)

3.3 プリセット表示名

内部名日本語英語説明
zero-latency最速モードFastest Mode光回線同士の演奏に
ultra-low-latency低遅延モードLow Delay Mode安定した回線での演奏に
balancedバランスモードBalanced Mode通常のインターネット接続に最適
high-quality高音質モードHigh Quality Mode高速回線での録音向け

4. 画面構成と情報階層

4.1 画面一覧

画面用途優先度
メインセッション参加/作成、基本操作最高
ミキサー参加者の音量調整
設定オーディオデバイス、プリセット
接続情報詳細なネットワーク統計
オンボーディング初回セットアップ初回のみ

4.2 情報階層

レベル1(常時表示)
├─ 接続状態アイコン(緑/黄/赤)
├─ 現在のモード名
└─ 基本操作ボタン(開始/終了)

レベル2(1クリックで表示)
├─ 参加者一覧
├─ 音量スライダー
└─ ミュートボタン

レベル3(設定画面)
├─ プリセット選択
├─ デバイス選択
└─ 言語/テーマ設定

レベル4(詳細設定 - 折りたたみ内)
├─ サンプルレート
├─ フレームサイズ
├─ コーデック選択
└─ 技術的な接続統計

4.3 画面遷移図


5. コンポーネント設計指針

5.1 接続状態インジケーター

状態アイコンテキスト
未接続グレー空の円未接続
接続中黄(点滅)回転アイコン接続中...
接続済みチェック接続中
不安定警告不安定
切断X切断されました

5.2 ミキサーチャンネルストリップ

┌─────────────┐
│ 名前/ラベル │
├─────────────┤
│ レベルメーター │
│ (縦型) │
├─────────────┤
│ 音量フェーダー │
├─────────────┤
│ [M] [S] [P] │
│ ミュート/ソロ/Pan │
└─────────────┘

サイズ:
- Desktop: 幅 100px / 高さ 300px
- Mobile: 幅 80px / 高さ 250px

操作仕様:

  • フェーダー: ドラッグで音量調整(0-100%)
  • ダブルクリック: 100%にリセット
  • ミュートボタン: トグル(アクティブ時は赤)
  • ソロボタン: トグル(アクティブ時は黄)
  • Panノブ: 左右パンニング(-100〜+100)

5.3 ボタンスタイル

タイプ用途スタイル
プライマリ主要アクションアクセントカラー背景、白テキスト、radius 8px
セカンダリ補助アクション透明背景、グレーボーダー
デンジャー破壊的アクション赤系背景、白テキスト
アイコンコンパクト操作32x32px、透明背景

5.4 プリセットセレクター

カード形式のラジオボタンで表示:

┌─────────────────────────────────────────────────┐
│ ○ 最速モード ★推奨 │
│ 光回線同士の演奏に。遅延を最小限に │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ ● バランスモード │
│ 通常のインターネット接続に最適 │
└─────────────────────────────────────────────────┘

推奨マーク表示基準:

ジッター推奨プリセット
< 1ms最速モード
1-3ms低遅延モード
3-10msバランスモード
> 10ms高音質モード

6. 状態管理とユーザーフィードバック

6.1 トースト通知

位置: 画面右下

タイプ持続時間閉じ方
成功3秒自動
情報4秒自動
警告5秒手動ボタンあり
エラー手動で閉じるまで

:

┌─────────────────────────────────────┐
│ ✓ セッションに参加しました │
└─────────────────────────────────────┘

┌─────────────────────────────────────┐
│ ⚠ 接続が不安定です │
│ 有線LANの使用をお勧めします │
│ [詳細] [×] │
└─────────────────────────────────────┘

6.2 ローディング状態

アクション表示タイムアウト
セッション作成ボタン内スピナー10秒
セッション参加ボタン内スピナー15秒
デバイス検出プログレスバー5秒
オーディオ開始ボタン無効化3秒

6.3 接続品質フィードバック

ステータスバー(常時表示): ● 接続中(15ms)

詳細表示(接続情報画面):

┌─────────────────────────────────────┐
│ 接続品質: 良好 ● │
├─────────────────────────────────────┤
│ 遅延: 15ms │
│ 安定性: 非常に安定 │
│ ✓ 最速モードが使えます │
│ [最速に切り替え] │
└─────────────────────────────────────┘

6.4 インライン検証

招待コード
┌─────────────────────────────┐
│ ABC12X │ ← 赤ボーダー
└─────────────────────────────┘
⚠ 招待コードが見つかりません

7. Desktop / Mobile の差分

7.1 共通仕様

  • 全機能を両プラットフォームで利用可能
  • レスポンシブ設計(ブレークポイント: 768px)
  • 同一のカラーパレット・デザイントークン

7.2 プラットフォーム別仕様

項目DesktopMobile
ナビゲーション横タブ(上部)ボトムタブバー
ウィンドウサイズ最小 800x600px、推奨 1280x720px最小 320x568px
ミキサー横スクロール、最大10チャンネル表示横スクロール + ページネーション
キーボード操作ショートカット対応なし
システム連携システムトレイ常駐(オプション)バックグラウンド動作
ジェスチャーなしスワイプでタブ切り替え

7.3 レスポンシブレイアウト

Desktop(>= 768px):

┌──────────────────────────────────────────────┐
│ ヘッダー │
├──────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────────────────┐│
│ │ セッション │ │ オーディオ設定 ││
│ │ パネル │ │ ││
│ └──────────────┘ └──────────────────────────┘│
│ ┌──────────────────────────────────────────┐│
│ │ ミキサー(横並び) ││
│ └──────────────────────────────────────────┘│
└──────────────────────────────────────────────┘

Mobile(< 768px):

┌─────────────────────┐
│ ヘッダー(簡略化) │
├─────────────────────┤
│ セッションパネル │
├─────────────────────┤
│ オーディオ設定 │
├─────────────────────┤
│ ミキサー │
│ (横スクロール) │
├─────────────────────┤
│ [メイン][ミキサー] │
│ [設定][接続] │
└─────────────────────┘

8. カラーパレットとデザイントークン

8.1 ダークモード

トークン用途
--color-bg-primary背景(メイン)#1E1E2E
--color-bg-secondary背景(パネル)#2A2A3E
--color-bg-elevatedカード、モーダル#363652
--color-accentボタン、リンク#7C5CFF
--color-accent-hoverアクセント(ホバー)#9B7FFF
--color-success成功#4ADE80
--color-warning警告#FBBF24
--color-dangerエラー#F87171
--color-text-primaryテキスト(主)#FFFFFF
--color-text-secondaryテキスト(副)#A0A0B0
--color-text-disabledテキスト(無効)#606070
--color-borderボーダー#404060
--color-border-focusフォーカスボーダー#7C5CFF

8.2 ライトモード

トークン用途
--color-bg-primary背景(メイン)#FAFAFA
--color-bg-secondary背景(パネル)#FFFFFF
--color-bg-elevatedカード、モーダル#FFFFFF
--color-accentボタン、リンク#6B4FE0
--color-accent-hoverアクセント(ホバー)#5A3FD0
--color-success成功#22C55E
--color-warning警告#EAB308
--color-dangerエラー#EF4444
--color-text-primaryテキスト(主)#1A1A2E
--color-text-secondaryテキスト(副)#6B6B80
--color-text-disabledテキスト(無効)#A0A0B0
--color-borderボーダー#E0E0E8
--color-border-focusフォーカスボーダー#6B4FE0

8.3 タイポグラフィ

トークンサイズ太さ用途
--font-h124px700画面タイトル
--font-h218px600セクションタイトル
--font-h316px600小見出し
--font-body14px400本文
--font-caption12px400キャプション
--font-mono14px400コード、数値

フォントファミリー:

--font-family-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Hiragino Sans', 'Noto Sans JP', sans-serif;
--font-family-mono: 'SF Mono', 'Fira Code', Consolas, monospace;

8.4 スペーシング

トークン
--space-xs4px
--space-sm8px
--space-md16px
--space-lg24px
--space-xl32px
--space-2xl48px

8.5 角丸

トークン用途
--radius-sm4px入力フィールド
--radius-md8pxカード、ボタン
--radius-lg12pxモーダル
--radius-full9999pxアイコンボタン、バッジ

8.6 シャドウ

トークン用途
--shadow-sm0 1px 2px rgba(0,0,0,0.1)軽い浮き上がり
--shadow-md0 4px 6px rgba(0,0,0,0.15)カード
--shadow-lg0 10px 15px rgba(0,0,0,0.2)モーダル

8.7 アニメーション

トークン用途
--transition-fast100ms ease-outホバー、アクティブ状態
--transition-normal200ms ease-out画面遷移、展開
--transition-slow300ms ease-outモーダル表示

9. オンボーディングフロー

9.1 フロー概要

9.2 各ステップの内容

Step 1: ようこそ

┌─────────────────────────────────────┐
│ │
│ jamjam │
│ │
│ 音楽仲間とオンラインで │
│ 一緒に演奏しよう │
│ │
│ [ 始める ] │
│ │
│ ・ マイクとスピーカーが必要です │
│ ・ ヘッドフォンの使用をお勧めします │
│ │
└─────────────────────────────────────┘

Step 2: マイク選択

┌─────────────────────────────────────┐
│ ステップ 1/4 │
│ │
│ マイクを選んでください │
│ │
│ ┌─────────────────────────────┐ │
│ │ ○ 内蔵マイク │ │
│ │ ● USB オーディオ (推奨) │ │
│ │ ○ Bluetooth ヘッドセット │ │
│ └─────────────────────────────┘ │
│ │
│ レベル: ████████░░░░░░░ 良好 │
│ │
│ [戻る] [次へ] │
└─────────────────────────────────────┘

Step 3: スピーカー選択

┌─────────────────────────────────────┐
│ ステップ 2/4 │
│ │
│ スピーカーを選んでください │
│ │
│ ┌─────────────────────────────┐ │
│ │ ● ヘッドフォン (推奨) │ │
│ │ ○ 内蔵スピーカー │ │
│ │ ○ Bluetooth スピーカー │ │
│ └─────────────────────────────┘ │
│ │
│ ⚠ スピーカー使用時はエコーが │
│ 発生する可能性があります │
│ │
│ [戻る] [次へ] │
└─────────────────────────────────────┘

Step 4: テスト

┌─────────────────────────────────────┐
│ ステップ 3/4 │
│ │
│ 音声をテストしましょう │
│ │
│ [テスト音を再生] │
│ │
│ 音は聞こえましたか? │
│ ┌─────────────────────────────┐ │
│ │ ● はい、聞こえました │ │
│ │ ○ いいえ、聞こえません │ │
│ └─────────────────────────────┘ │
│ │
│ 聞こえない場合は、スピーカーの │
│ 音量を確認してください │
│ │
│ [戻る] [次へ] │
└─────────────────────────────────────┘

Step 5: モード選択

┌─────────────────────────────────────┐
│ ステップ 4/4 │
│ │
│ モードを選んでください │
│ │
│ ┌─────────────────────────────┐ │
│ │ ● バランスモード(推奨) │ │
│ │ 通常のインターネット接続向け │ │
│ ├─────────────────────────────┤ │
│ │ ○ 最速モード │ │
│ │ 光回線同士の演奏向け │ │
│ ├─────────────────────────────┤ │
│ │ ○ 高音質モード │ │
│ │ 録音向け │ │
│ └─────────────────────────────┘ │
│ │
│ 後から設定で変更できます │
│ │
│ [戻る] [完了] │
└─────────────────────────────────────┘

9.3 スキップオプション

  • 各ステップに「スキップ」リンクを配置(控えめに)
  • スキップ時はデフォルト値を使用
  • 「後で設定」リンクで完全スキップも可能

10. エラーハンドリングとメッセージング

10.1 エラーメッセージフォーマット

[アイコン] タイトル(何が起きたか)
説明(なぜ起きたか + どうすればいいか)
[アクション] [詳細を見る]

10.2 エラーカタログ

エラーコードタイトル説明アクション
ERR_CONN_TIMEOUT接続できませんでした相手に接続できませんでした。招待コードが正しいか確認してください。[再試行]
ERR_CONN_REFUSED接続が拒否されました相手がセッションを終了した可能性があります。[OK]
ERR_CONN_UNSTABLE接続が不安定ですインターネット接続が不安定です。有線LANの使用をお勧めします。[設定を変更]
ERR_AUDIO_DEVICEマイクが使えませんマイクにアクセスできません。他のアプリが使用中の可能性があります。[デバイスを変更]
ERR_AUDIO_OUTPUTスピーカーが使えませんスピーカーにアクセスできません。[デバイスを変更]
ERR_SESSION_FULLセッションがいっぱいです参加者数の上限に達しています。[OK]
ERR_NETWORK_NAT直接接続できませんNAT越えに失敗しました。ルーターの設定を確認してください。[詳細を見る]

10.3 警告メッセージ

状況メッセージ表示方法
WiFi使用検出有線LANの使用をお勧めします。WiFiでは遅延が大きくなることがあります。トースト(警告)
高ジッター接続が不安定です。モードを「バランス」に切り替えることをお勧めします。バナー
パケットロス > 2%接続品質が低下しています。ステータスアイコン変化
バッテリー低下(Mobile)バッテリーが少なくなっています。充電しながらの使用をお勧めします。トースト

10.4 技術詳細の表示

「詳細を見る」ボタンを押した場合のみ表示:

┌─────────────────────────────────────┐
│ ❌ 接続できませんでした │
│ 相手に接続できませんでした。 │
│ 招待コードが正しいか確認して │
│ ください。 │
│ │
│ ▼ 技術的な詳細 │
│ ┌─────────────────────────────┐ │
│ │ Error: Connection timeout │ │
│ │ Code: ERR_CONN_TIMEOUT │ │
│ │ Target: 192.168.1.50:5000 │ │
│ │ Elapsed: 15.2s │ │
│ │ NAT Type: Symmetric │ │
│ └─────────────────────────────┘ │
│ │
│ [コピー] [再試行] [閉じる] │
└─────────────────────────────────────┘

11. アクセシビリティ要件

11.1 必須要件

項目要件
キーボード操作全機能をキーボードのみで操作可能
フォーカス表示フォーカス状態を明確に表示(2px以上のアウトライン)
コントラスト比WCAG AA準拠(通常テキスト 4.5:1、大きいテキスト 3:1)
スクリーンリーダー主要機能でaria-labelを提供
モーションprefers-reduced-motionを尊重

11.2 キーボードショートカット

ショートカットアクション
Tab / Shift+Tabフォーカス移動
Enter / Spaceボタン押下、選択
Escapeモーダルを閉じる、キャンセル
Ctrl/Cmd + M自分をミュート/ミュート解除
Ctrl/Cmd + 1-4タブ切り替え
Ctrl/Cmd + ,設定を開く

11.3 スクリーンリーダー対応

<!-- 接続状態 -->
<div role="status" aria-live="polite" aria-label="接続状態: 接続中、遅延15ミリ秒">
● 接続中(15ms)
</div>

<!-- ミュートボタン -->
<button aria-label="自分をミュート" aria-pressed="false">
M
</button>

<!-- 音量スライダー -->
<input type="range"
aria-label="音量"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="80"
aria-valuetext="80パーセント">

11.4 色覚多様性対応

  • 色だけで情報を伝えない(アイコン、テキストを併用)
  • 成功/警告/エラーは色に加えてアイコンで区別
  • 色覚シミュレーションでテスト必須

12. 翻訳キー(i18n)

以下のキーを ui/locales/ja.json および ui/locales/en.json に追加する:

{
"onboarding": {
"welcome": {
"title": "ようこそ",
"subtitle": "音楽仲間とオンラインで一緒に演奏しよう",
"start": "始める",
"headphoneNote": "ヘッドフォンの使用をお勧めします"
},
"mic": {
"title": "マイクを選んでください",
"level": "レベル",
"good": "良好"
},
"speaker": {
"title": "スピーカーを選んでください",
"echoWarning": "スピーカー使用時はエコーが発生する可能性があります"
},
"test": {
"title": "音声をテストしましょう",
"playTest": "テスト音を再生",
"heard": "音は聞こえましたか?",
"yes": "はい、聞こえました",
"no": "いいえ、聞こえません",
"volumeHint": "聞こえない場合は、スピーカーの音量を確認してください"
},
"mode": {
"title": "モードを選んでください",
"changeLater": "後から設定で変更できます"
},
"nav": {
"back": "戻る",
"next": "次へ",
"skip": "スキップ",
"done": "完了"
}
},
"presets": {
"zeroLatency": {
"name": "最速モード",
"description": "光回線同士の演奏に。遅延を最小限に"
},
"ultraLowLatency": {
"name": "低遅延モード",
"description": "安定した回線での演奏に"
},
"balanced": {
"name": "バランスモード",
"description": "通常のインターネット接続に最適"
},
"highQuality": {
"name": "高音質モード",
"description": "高速回線での録音向け"
}
},
"quality": {
"veryStable": "非常に安定",
"stable": "安定",
"unstable": "やや不安定",
"veryUnstable": "不安定",
"recommendation": "「{preset}」モードをお勧めします",
"switchTo": "{preset}に切り替え"
},
"errors": {
"connectionTimeout": {
"title": "接続できませんでした",
"description": "相手に接続できませんでした。招待コードが正しいか確認してください。"
},
"connectionRefused": {
"title": "接続が拒否されました",
"description": "相手がセッションを終了した可能性があります。"
},
"connectionUnstable": {
"title": "接続が不安定です",
"description": "インターネット接続が不安定です。有線LANの使用をお勧めします。"
},
"audioDevice": {
"title": "マイクが使えません",
"description": "マイクにアクセスできません。他のアプリが使用中の可能性があります。"
},
"retry": "再試行",
"changeDevice": "デバイスを変更",
"viewDetails": "詳細を見る"
},
"warnings": {
"wifiDetected": "有線LANの使用をお勧めします。WiFiでは遅延が大きくなることがあります。",
"highJitter": "接続が不安定です。モードを「バランス」に切り替えることをお勧めします。",
"batteryLow": "バッテリーが少なくなっています。充電しながらの使用をお勧めします。"
},
"theme": {
"title": "テーマ",
"light": "ライト",
"dark": "ダーク",
"system": "システム設定に従う"
}
}

13. 実装チェックリスト

実装対象ファイル

ファイル変更内容
ui/src/styles.cssカラーパレット、デザイントークン適用
ui/locales/ja.json用語変更、新規キー追加
ui/locales/en.json用語変更、新規キー追加
ui/src/main.tsオンボーディング、エラーハンドリング実装

検証項目

  • オンボーディング: 初回起動から5ステップで完了できる
  • レスポンシブ: 768px以下でボトムナビに切り替わる
  • アクセシビリティ: キーボードのみで全操作可能
  • エラー表示: 各エラー状態でユーザーフレンドリーなメッセージが表示される
  • カラーモード: ライト/ダーク/システム追従が正しく動作する
  • 用語: 専門用語が平易な表現に置き換えられている
  • トースト: 各タイプで適切な持続時間と閉じ方が機能する