デザインガイド - jamjam UI
jamjam のビジュアルデザイン方針。MixerPanel をトンマナのベースとする。
デザイン原則
1. 機能優先(Function First)
デザインは機能に従う。装飾より操作性。
- 音楽制作ツール(DAW)のような専門的で機能的な美学
- 視覚的なノイズを排除し、本質的な情報のみ表示
- ユーザーが「操作できる」ことが即座にわかるUI
2. モノクロームベース(Monochrome Base)
色は情報を伝える手段。装飾ではない。
- 基本UIはモノクローム(黒/白/グレー)
- 色は意味がある場合のみ使用:
- 接続状態(緑/黄/赤)
- エラー状態(赤)
- フォーカス状態(アクセント色)
- 「色がある = 注目すべき情報」という認知
3. 精密さ(Precision)
1pxのズレも許容しない。
- グリッドベースの厳密なレイアウト
- 要素間のアライメント統一
- 数値は等幅フォントで桁揃え
カラーパレット
基本色(常時使用)
| 用途 | トークン | 役割 |
|---|---|---|
| 主要テキスト | --color-text-primary | メインのテキスト、アクティブな要素 |
| 副次テキスト | --color-text-secondary | 補助情報、非アクティブな要素 |
| 背景 | --color-bg-primary | メイン背景 |
| ボーダー | --color-border | 区切り線、境界 |
状態色(意味がある場合のみ)
| 状態 | トークン | 使用場面 |
|---|---|---|
| 接続成功 | --color-success | 接続インジケータ |
| 警告/不安定 | --color-warning | 接続不安定、注意 |
| エラー/ミュート | --color-danger | エラー、切断 |
| フォーカス | --color-accent | キーボードフォーカスリング |
使用禁止
- 装飾目的のグラデーション
- 背景色としてのアクセント色
- 意味のない色分け
タイポグラフィ
フォント使い分け
| 種類 | フォント | 用途 |
|---|---|---|
| UI テキスト | --font-family-sans | ラベル、説明文 |
| 数値 | --font-family-mono | dB表示、時間、サンプルレート |
サイズ
| サイズ | トークン | 用途 |
|---|---|---|
| 11px | --font-size-small | メーター数値、品質表示 |
| 12px | --font-size-caption | 補助ラベル |
| 14px | --font-size-body | 通常テキスト |
数値表示の原則
/* 数値は常に等幅フォント */
.numeric {
font-family: var(--font-family-mono);
}
/* 右揃え or 中央揃えで桁を統一 */
.db-display {
text-align: right;
min-width: 4ch; /* "-∞" から "+0.0" まで対応 */
}
ボーダーと形状
ボーダー
| 要素 | スタイル |
|---|---|
| コンポーネント境界 | 1px solid var(--color-border) |
| セクション区切り | 1px solid var(--color-border) |
| インタラクティブ要素 | 1px solid var(--color-border) |
角丸
/* 原則: 角丸なし */
border-radius: 0;
/* 例外: 円形ボタンのみ */
border-radius: var(--radius-full);
シャドウ
/* 原則: シャドウなし */
box-shadow: none;
/* 例外: フォーカスリングのみ */
box-shadow: var(--shadow-focus);
インタラクション
状態表現
| 状態 | 表現方法 |
|---|---|
| デフォルト | border: 1px solid var(--color-border) |
| ホバー | border-color: var(--color-text-primary) |
| フォーカス | box-shadow: var(--shadow-focus) |
| アクティブ | 背景反転(text-primary ↔ bg-primary) |
| 無効 | opacity: 0.5 |
ボタン
/* 通常状態 */
.button {
background: transparent;
border: 1px solid var(--color-border);
color: var(--color-text-primary);
}
/* アクティブ/トグルON */
.button--active {
background: var(--color-text-primary);
color: var(--color-bg-primary);
}
スライダー/フェーダー
/* トラック */
.track {
width: 1px;
background: var(--color-text-primary);
}
/* サム(つまみ) */
.thumb {
background: var(--color-bg-primary);
border: 1px solid var(--color-text-primary);
}
レイアウト
スペーシング
4px ベースのグリッドシステム。
--space-xs: 4px; /* 最小間隔 */
--space-sm: 8px; /* コンポーネント内部 */
--space-md: 16px; /* コンポーネント間 */
アライメント
┌─────────────────────────────────────┐
│ ラベル列 │ コンテンツ列 │
│ (右揃え) │ (左揃え/中央揃え) │
├───────────┼───────────────────────┤
│ 音質 │ 48kHz/2ch │
│ PAN │ [====●====] │
│ 音量 │ ┃█████┃ │
│ 名前 │ Alice │
│ ミュート│ [🔊] │
└───────────┴───────────────────────┘
コンポーネント例
MixerPanel(リファレンス)
┌─────────────────────────────────────────────┐
│ ミキサー │
├─────────────────────────────────────────────┤
│ │ 48kHz/2ch │ 48kHz/2ch │ 48kHz/2ch │
│ │ C │ L30 │ │
│ │ [══●══] │ [●════] │ -12db │
│ │ │ │ -15db │
│ │ +0.0 -14 │ -0.6 -13 │ │
│ │ ██ │ ██ │ ██ │
│ │ ██ │ ██ │ ██ │
│ │ ██ │ ██ │ ██ │
│ │ 自分 │ Alice │ マスター │
│ │ [🎤] │ [🔊] │ [🔊] │
└─────────────────────────────────────────────┘
特徴
- ヘッダー: タブ形式、下線で区切り
- ラベル列: 右揃え、副次テキスト色
- コントロール: 1px ボーダー、角丸なし
- メーター: モノクローム、ミュート時はグレー
- ボタン: 反転で ON/OFF 表現
禁止事項
やってはいけないこと
-
装飾的なグラデーション
/* NG */
background: linear-gradient(to bottom, #7C5CFF, #5A3FD0); -
意味のない角丸
/* NG */
border-radius: 8px; /* 単なる装飾 */ -
過剰なシャドウ
/* NG */
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.15); -
色でのグルーピング
/* NG: 背景色で領域を分ける */
.section-a { background: #2A2A3E; }
.section-b { background: #363652; } -
アイコンの多用
- テキストで表現できるものはテキストで
- アイコンは「ミュート」「スピーカー」など普遍的なもののみ
実装チェックリスト
新しいコンポーネントを作成する際のチェック項目:
- カラーは
--color-text-primary/secondaryと--color-borderのみ使用しているか - 状態色は意味がある場合のみ使用しているか
-
border-radius: 0か(例外を除く) -
box-shadow: noneか(フォーカスリング以外) - 数値表示は
--font-family-monoを使用しているか - スペーシングは 4px の倍数か
- ホバー/フォーカス/アクティブ状態が定義されているか
参考
- MixerPanel コンポーネント:
ui/src/components/MixerPanel/ - デザイントークン:
ui/src/styles/tokens.css