# ADR-049: Figma Code Connect 設計系統同步 | 項目 | 內容 | |------|------| | **狀態** | 📋 已批准,待實作 | | **日期** | 2026-04-01 | | **決策者** | 首席架構師 + 統帥 | | **觸發** | MCP 整合長期計畫 | ## 背景 前端 UI 元件與 Figma 設計稿可能產生漂移(drift):設計師在 Figma 更新了元件樣式或佈局,但 `apps/web/src/components/` 下的 React 元件未同步更新,導致 QA 發現視覺差異時已累積大量技術債。 目前缺乏任何機制能夠: 1. 讓設計師在 Figma 中直接看到對應的程式碼元件 2. 在 Code Review 時確認 UI 實作與設計稿的一致性 3. 系統化追蹤哪些元件存在 design-code drift ## 問題 | 面向 | 現況 | 目標 | |------|------|------| | 設計-代碼映射 | 無正式對應關係 | Figma 元件 ↔ React 元件 1:1 映射 | | 漂移偵測 | 手動 QA 發現 | 每週自動掃描確認映射狀態 | | 設計師工作流 | 不知道對應哪支 component | Figma Dev Mode 直接顯示程式碼 | ## 決策 使用 **Figma Code Connect** 建立 `.figma.js` 映射文件,將每個 Figma 元件對應到 React 元件的 import 與 props 結構。 定期(每週)使用 Figma MCP 掃描設計稿,確認映射是否需要更新。 ## 架構 ### 文件結構 ``` apps/web/src/components/ ├── ui/ │ ├── button/ │ │ ├── Button.tsx │ │ └── Button.figma.js ← Code Connect 映射 │ ├── card/ │ │ ├── Card.tsx │ │ └── Card.figma.js │ └── badge/ │ ├── Badge.tsx │ └── Badge.figma.js ├── incident/ │ ├── IncidentCard.tsx │ └── IncidentCard.figma.js └── approval/ ├── ApprovalCard.tsx └── ApprovalCard.figma.js ``` ### Code Connect 映射格式 ```js // Button.figma.js import figma from '@figma/code-connect' import { Button } from './Button' figma.connect(Button, 'https://www.figma.com/design/FILEID?node-id=NODE_ID', { props: { variant: figma.enum('Variant', { primary: 'primary', secondary: 'secondary', destructive: 'destructive', }), size: figma.enum('Size', { sm: 'sm', md: 'md', lg: 'lg', }), label: figma.string('Label'), disabled: figma.boolean('Disabled'), }, example: ({ variant, size, label, disabled }) => ( ), }) ``` ### 每週掃描流程 ``` Claude Code + Figma MCP → get_design_context (核心元件節點) → get_code_connect_suggestions → 比對現有 .figma.js 映射 → 輸出「drift report」 → 若有差異 → 建立 GitHub Issue ``` ## 實作計畫 ### P1:核心 UI 元件(第 1 週) | 元件 | Figma 節點 | React 路徑 | |------|------------|------------| | Button | TBD | `components/ui/button/Button.tsx` | | Card | TBD | `components/ui/card/Card.tsx` | | Badge | TBD | `components/ui/badge/Badge.tsx` | | Input | TBD | `components/ui/input/Input.tsx` | | Modal | TBD | `components/ui/modal/Modal.tsx` | **前置條件**: 確認 Figma 文件 URL 與節點 ID(需統帥提供) ### P2:業務元件(第 2-3 週) | 元件 | Figma 節點 | React 路徑 | |------|------------|------------| | IncidentCard | TBD | `components/incident/IncidentCard.tsx` | | ApprovalCard | TBD | `components/approval/ApprovalCard.tsx` | | AlertBanner | TBD | `components/alert/AlertBanner.tsx` | | StatusBadge | TBD | `components/status/StatusBadge.tsx` | ### P3:Storybook 整合(第 4 週,視現況決定) - 確認是否已有 Storybook 設置 - 若已有:在 Story 中引用 Code Connect 映射 - 若未有:評估導入成本,記入 INSPIRATION_LAB.md 待批准 ## 工具需求 ```json // package.json (apps/web) { "devDependencies": { "@figma/code-connect": "^1.x" } } ``` 發布指令(需 Figma Personal Access Token): ```bash npx figma connect publish --token $FIGMA_ACCESS_TOKEN ``` ## 注意事項 1. **Figma URL 需要統帥提供**:在執行 P1 前,需要確認 Figma 設計稿的文件 ID 和各核心元件的節點 ID 2. **Token 管理**:`FIGMA_ACCESS_TOKEN` 需存入 K8s Secrets,不得 hardcode 3. **每週掃描**:由 Claude Code + Figma MCP 執行,不需要新增 CI 步驟 4. **`.figma.js` 檔案不影響 build**:只在開發環境和 Code Connect 發布時使用 ## 影響 | 面向 | 影響 | |------|------| | **設計師** | Figma Dev Mode 可直接看到對應元件的 import 和 props | | **前端開發** | PR 時有明確參考,減少「我以為設計是這樣」問題 | | **QA** | 視覺差異有跡可查,drift report 提前預警 | | **Build 時間** | 無影響,`.figma.js` 不參與 webpack/next build | ## 相關文件 - [feedback_design_system_quickref.md](~/.claude/projects/-Users-ogt-awoooi/memory/feedback_design_system_quickref.md) - [feedback_ui_collaboration_protocol.md](~/.claude/projects/-Users-ogt-awoooi/memory/feedback_ui_collaboration_protocol.md) - Figma Code Connect 官方文件:https://www.figma.com/developers/code-connect