# DESIGN.md — MAESTRO > AI エージェントが一貫した日本語 UI を生成するためのデザイン仕様書。 > `AGENTS.md`(作り方)の隣に置く「見た目と雰囲気」の source of truth。 > セクションヘッダーは英語、値の説明は日本語([awesome-design-md-jp](https://github.com/kzhrknt/awesome-design-md-jp) の Stitch 拡張フォーマットに準拠)。 > > **この文書が視覚判断の正準**。`docs/design/README.md` は改名前・ライトモード前提の旧版で、ここで上書きする。 > 値はすべて**ライブのコード**(`ui/tailwind.config.js` / `ui/src/index.css`)から採取。色は CSS 変数でライト/ダークを切り替える。 --- ## 1. Visual Theme & Atmosphere - **デザイン方針**: Refero 系の「ミニマル+高密度」。装飾を削り、ハイライン(極細罫)で構造を作る。影に頼らない - **密度**: 情報密度の高い業務 UI。本文 13px の詰まったレイアウト - **キーワード**: 静か、無彩色、機能的、罫線主導、操作対象に語りかける(人称を出さない) - **特徴**: ニアブラック(#18181b)を唯一のブランド差し色にしたほぼ無彩色。ライト/ダーク両対応で、ダークは pitch-black を避けやや持ち上げた zinc 調 - **トーン**: オペレーター向け。感嘆符なし、UI クロムに絵文字を置かない(絵文字はエージェント生成コンテンツ内の限定箇所のみ) --- ## 2. Color Palette & Roles 色は CSS 変数経由。`*-slate-*` クラス(1454 箇所)がそのままライト/ダークで反転する。**ブランド色はランタイム branding(`/api/branding`)で差し替え可能** — ハードコードしない。 ### Brand(既定。branding 未設定時のフォールバック) | Role | Var | 既定値 | |---|---|---| | Primary | `--brand-primary` | `#18181b`(ニアブラック) | | Primary deep(hover) | `--brand-primary-deep` | `#09090b` | | Primary soft(選択/active tint・light) | `--brand-primary-soft` | `#f4f4f5` | | Primary soft(dark) | `--brand-primary-soft` | `#2c2c34` | | Primary ring(focus) | `--brand-primary-ring` | `rgba(24,24,27,0.25)` | | Primary fg(差し色上の文字) | `--brand-primary-fg` | `#ffffff` | > 旧版の `#2563eb`(blue-600)はモダン化で**廃止**。新規 UI で青を主役にしない。 **ブランド色の解決順**: `スペース個別の色(spaces.brand_color)` → `組織/全体 branding(config.yaml / data/branding)` → `既定 #18181b`。スペース(案件)が自分の色を持てる(クライアント別など)。`--brand-primary-fg`(コントラスト文字色)/ `-deep`(hover)/ `-soft`(tint)/ `-ring`(focus)は選択色から導出する。**ハードコードせず必ず `--brand-primary*` 変数を使う**。Space rail のアバター・アクティブ tint も同じ変数で色付く。 ### Semantic surfaces | Role | Var | Light | Dark | |---|---|---|---| | Canvas(最背面) | `--canvas` | `#ffffff` | `#18181c` | | Surface(パネル) | `--surface` | `#fafafa` | `#202024` | | Surface-2(入れ子) | `--surface-2` | `#f4f4f5` | `#2a2a30` | | Hairline(罫線) | `--hairline` | `#e4e4e7` | `#3a3a42` | | Hairline-soft | `--hairline-soft` | `#f4f4f5` | `#2a2a30` | | Ink(本文) | `--ink` | `#0f172a` | `#e7e7ea` | | Muted(補助) | `--muted` | `#64748b` | `#a1a1aa` | ### Neutral ramp(`--slate-50…950`) Light = Tailwind 既定 slate(`#f8fafc`→`#020617`)。Dark = 反転 zinc 調(`--slate-50 #18181c` → `--slate-950 #fafafa`)。`50/100` = サーフェス、`700/900` = テキスト、という意味付けで使う。 ### Status(状態色は Tailwind 既定スケール維持) `statusTone()`(`ui/src/lib/utils.ts`)が一元定義。running/success=emerald、waiting/retry=amber、subtasks=indigo、failed=red、queued/cancelled=slate。pastel bg + deep fg のピル。 --- ## 3. Typography Rules ### 3.1 和文フォント `IBM Plex Sans JP`(主)→ `Hiragino Sans`(フォールバック)。Google Fonts から読込済み。 ### 3.2 欧文・等幅フォント 等幅は `JetBrains Mono`(主)→ `IBM Plex Mono`。識別子・ログ・バージョン・cron 式・SMALL-CAPS マイクロラベルに使う。 ### 3.3 font-family 指定(フォールバック込み) ```css --font-sans: 'IBM Plex Sans JP', 'Hiragino Sans', system-ui, sans-serif; --font-mono: 'JetBrains Mono', 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace; ``` ### 3.4 文字サイズ・ウェイト階層 - 本文 **13px**(`0.8125rem`)— 高密度の基準。タイトル 18px(詳細)/ 20px(ダイアログ)、チャット 14px、マイクロラベル 11px(`2xs`)/ 10px - ウェイトは重め。700(bold) が主役(ボタン・ピル・チップ・微小ラベル)、800(extrabold) はタイトルと主 CTA、本文のみ 400/500 - モバイル入力は `font-size: 16px !important`(iOS 自動ズーム防止) ### 3.5 行間・字間 - 本文 `line-height: 1.55`、見出し/詰めたい所 `1.3`、汎用 `1.5` - **CJK 長文は 1.6–1.8 を推奨**(和文は欧文より行間を広く) - マイクロ大文字ラベルは `letter-spacing: 0.04em`。和文本文に欧文的なベタ詰めをしない ### 3.6 禁則処理・改行ルール - 禁則はブラウザ既定(CJK 句読点・閉じ括弧の行頭禁則)を尊重 - 長い識別子・URL は `overflow-wrap: anywhere` で折る。和文本文は `word-break: normal`(無理な分割をしない) - 数字+単位は分離させない: `N 件` / `N分前`(相対時刻は和文 `たった今 / N分前 / N時間前 / N日前`) ### 3.7 OpenType 機能 - 和文プロポーショナル詰めが要る見出しに `font-feature-settings: "palt" 1`、カーニング `"kern" 1` - 等幅(JetBrains Mono)は `font-feature-settings: 'cv11','ss01','ss03'`(コード可読性向けの既存設定) ### 3.8 縦書き 非対応(業務 UI のため横書き固定)。 --- ## 4. Component Stylings 実体は `ui/src/components/**`。新規コンポーネントは下記レシピを踏襲する。 - **Card / Panel**: `bg-canvas`(入れ子は `bg-surface`)、`border border-hairline`、`rounded-md`(6px)、`shadow-sm`。padding `p-3`〜`p-4` - **Primary button**: ブランド差し色塗り(`bg-accent text-accent-fg`)、hover で deep。padding `8px 16px`、`rounded-md`、700 - **Ghost / secondary**: 透明 → hover `bg-surface-2`。罫線つきは `border-hairline` - **Input**: `bg-canvas border-hairline rounded-md`。focus は `ring-2` + `--brand-primary-ring` - **Tabs(TopBar)**: 下線タブ。active は下線+ ink、非 active は muted(`components/layout/TopBar.tsx`) - **Pill / Chip / StatusBadge**: `rounded-full`、pastel bg + deep fg、700。`statusTone()` 準拠 - **List item**: 入れ子ミニカード。active = `--brand-primary-soft` tint + 罫線昇格 - **Chat bubble**: user = 差し色塗り `rounded-2xl rounded-br-md`、agent result = emerald 系、ASK = amber 系(`ChatMessage`) - **Dialog**: 中央、`max-width: min(860px, 92vw)`、`max-height: 88dvh`、内部スクロール、`shadow-md`、overlay は straight alpha(blur 無し) ### 4.1 Space & Workspace surfaces(本スペックの新面) - **Space rail / list**: 左に縦並び。**個人スペースを先頭固定**、案件スペースが続く。各行は list-item レシピ。active = soft tint。可視性(private/org/public)を小さなマイクロラベルで示す - **Space detail**: 4レーン(資料 / 議事録 / 予定 / チャット)の俯瞰。タブピル or セクションで切替。土台で実体があるのは「チャット」「ファイル」。未実装レーンは**ダミーを出さず**、機能完成時に追加(個人の永続ワークスペースは土台から表示) - **File 窓**: ツリー(`FileBrowser.tsx`)+ プレビュー/編集(`FilePreview.tsx`)。`border-hairline` で 2 ペイン分割、ヘッダは `sticky bg-surface`。HTML アプリ実行は `