maestro/DESIGN.md
oss-sync 29ccaf1e92
Some checks failed
CI / build-and-test (push) Has been cancelled
sync: update from private repo (dfadcd5f)
2026-06-23 06:38:48 +00:00

178 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 deephover | `--brand-primary-deep` | `#09090b` |
| Primary soft選択/active tint・light | `--brand-primary-soft` | `#f4f4f5` |
| Primary softdark | `--brand-primary-soft` | `#2c2c34` |
| Primary ringfocus | `--brand-primary-ring` | `rgba(24,24,27,0.25)` |
| Primary fg差し色上の文字 | `--brand-primary-fg` | `#ffffff` |
> 旧版の `#2563eb`blue-600はモダン化で**廃止**。新規 UI で青を主役にしない。
**ブランド色の解決順**: `スペース個別の色spaces.brand_color``組織/全体 brandingconfig.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.61.8 を推奨**(和文は欧文より行間を広く)
- マイクロ大文字ラベルは `letter-spacing: 0.04em`。和文本文に欧文的なベタ詰めをしない
### 3.6 禁則処理・改行ルール
- 禁則はブラウザ既定CJK 句読点・閉じ括弧の行頭禁則)を尊重
- 長い識別子・URL は `overflow-wrap: anywhere` で折る。和文本文は `word-break: normal`(無理な分割をしない)
- 数字+単位は分離させない: `<b>N</b> 件` / `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`
- **TabsTopBar**: 下線タブ。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 alphablur 無し)
### 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 アプリ実行は `<iframe sandbox>` CSP で隔離DESIGN は枠のみ規定、実行境界はスペック §2.7
- **Task creation永続/一時的)**: `CreateTaskDialog` 内に **segmented control**2値トグル。既定は「永続」。差し色は active セグメントのみ、ghost で非 active。ラベルは和文「永続ワークスペース」/「一時的」)
---
## 5. Layout Principles
- 固定 TopBar`bg-canvas`、下罫線 `border-hairline`)。本体は残り `h-dvh` を埋め、root は `overflow-hidden`(各ペインが自前スクロール)
- 2カラム list+detail を全機能で統一(タスク/スケジュール/ユーザー/スペース)。編集は詳細パネル内インライン、モーダルは新規作成のみ
- Tailwind 4px スケール。パネル間ガター `8px`、カード padding `16px`
- トーストは上中央スライドイン、ダイアログは中央
---
## 6. Depth & Elevation
- **罫線主導の階層**。影は補助。`shadow-sm`resting/ `shadow-md`ダイアログの2段のみ。色付き影・内側影・グロー無し
- ダークは pitch-black を避け、canvas→surface→surface-2 を一段ずつ持ち上げて分離。罫線 `--hairline` で境界を担保(実機で WCAG AA を確認)
- グラスモーフィズム/backdrop-blur は使わない。overlay は `bg-slate-900/50` の straight alpha
---
## 7. Do's and Don'ts
**Do**
- ブランド色は CSS 変数(`--brand-primary*`)経由。ランタイム branding を尊重
- アイコンは Lucide 系の 2px ストローク・round cap・24×24・inline SVG
- 角丸は既定 `rounded-md`(6px)。ピル/アバターは `rounded-full`
- 絵文字は既存の限定箇所のみ(👍/👎 フィードバック、📋 チェックリスト)
**Don't**
- ❌ 青(#2563eb)を主役に戻す / ブランド色をハードコード
- ❌ グラデーション、任意 z-index、ランプ外のカスタム影、glassmorphism
- ❌ Heroicons solid / Material / Phosphor線幅が崩れる
- ❌ 角丸を 12px 以上に戻す(モダン化で 6px 基準に詰めた)
- ❌ 和文本文に欧文的ベタ詰め・狭い行間
---
## 8. Responsive Behavior
- **モバイル**: 単一カラム。入力 `font-size:16px`(ズーム防止)
- **タブレット**: list + chat
- **デスクトップ**: list + chat + detail の3カラム`clamp(240px,22vw,280px)` / flex / `clamp(280px,26vw,440px)`
- Space rail はモバイルでドロワー化、デスクトップで常設
---
## 9. Agent Prompt Guide
エージェントが**日本語 HTML アプリ/成果物**を生成するときは、この DESIGN.md を読み、次を守る:
1. 色は本書の semantic 変数か近似 hex を使い、ニアブラック差し色+無彩色を基調に。青を主役にしない
2. 和文は `IBM Plex Sans JP``Hiragino Sans`、行間 1.61.8、長 URL は `overflow-wrap:anywhere`、句読点の行頭禁則を尊重
3. 角丸 6px、罫線主導、影は最小、グラデ/グラス無し
4. アイコンは Lucide 系 2px ストローク。絵文字を UI クロムに使わない
5. ダーク対応が要るなら canvas/surface/hairline の3段で分離し、pitch-black を避ける
> 迷ったら「静かで、罫線で構造を作る、無彩色の業務 UI」に倒す。