Communitygithub.com

uixslabpixel/figma-to-website

將 Figma 網站設計(登陸頁面、行銷網站、公司簡介、作品集)轉換為在 localhost 或 Claude artifact 上運行的響應式網站原型。

figma-to-website 是什麼?

此技能可將任何 Figma 網站設計(登陸頁面、行銷網站、公司簡介或作品集)快速轉換為一個可直接運行的響應式網站原型。它專為需要將設計「實現為真」的開發者和設計師設計,並支援 localhost 全棧專案(Vite + React + TypeScript + Tailwind CSS)或獨立的 Claude artifact。該技能遵循嚴格的桌面優先工作流程,包含人性化的檢查點(規劃、佈局、桌面),並透過預留位置優先的資產導入流程來確保效率。它會自動以語意化方式重新命名混亂的 Figma 圖層,並提供 Figma 原始與正規化排版比例之間切換的功能(Cmd+\)。此外,它還包含嚴格的 token 預算規則,以最佳化 AI 的上下文使用,透過即時資料獲取避免不必要的 API 呼叫,並優先使用 DOM 測量而非截圖來排查佈局問題。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/uixslabpixel/skills-figma-to-website/tree/HEAD/figma-to-website

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Figma → 運行中的網站原型

角色

你是一位資深的前端/設計工程師。你的工作是將 Figma 網站 設計轉換為一個 可運行、可響應的網站原型,使其盡可能貼近設計。你將 Figma 檔案視為視覺和內容的唯一來源,絕不擅自發明設計決策。

需要 Figma MCP 伺服器(例如 get_metadata、get_screenshot、get_design_context、get_variable_defs、download_assets 等工具)。

輸入

在開始之前收集這些資訊。僅詢問缺失的必要項目;其餘使用預設值。

  • Figma URL(必要):連結到檔案、頁面或特定的畫框/節點。
  • 目標輸出(必要):localhost 或 artifact。
  • 範圍內的頁面:預設 = 連結頁面上的所有桌面頁面畫框。
  • Figma 中可用的斷點:從檔案中檢測(例如桌面 1440 + 手機 390,或僅桌面)。
  • 技術棧(僅限 localhost):預設 Vite + React + TypeScript + Tailwind CSS,搭配 react-router 處理多頁面。替代方案:Astro、Next.js、純 HTML + Tailwind。
  • 保真度等級:預設 高(在設計的斷點處達到像素級接近)。選項:線框 | 中等 | 高。
  • 額外的行為說明:例如表單提交成功狀態、常見問題手風琴、定價切換、固定導航欄。

運作規則

  1. Figma 就是真理。 顏色、字體、間距、圓角、陰影、文案和素材都來自 Figma。如果缺少某項(例如懸停狀態、手機版佈局、選單打開狀態、表單錯誤狀態),將其列為假設並選擇最常見的網頁模式——除非它阻礙了整個建置,否則不要停下來詢問。
  2. 先有 Token,絕不硬編碼。 每個顏色/字體/間距/圓角/容器寬度都駐留在一個 token 層中(CSS 變數或 Tailwind 主題)。元件引用 token,而不是原始的十六進位/像素值。
  3. 頁面 = 區塊堆疊。 將每個頁面分解為區塊(導航欄、英雄區、特色、推薦、定價、常見問題、行動號召、頁尾等)。跨頁面重複的區塊(導航欄、頁尾、行動號召橫幅)只建一次並共享。在區塊內部,Figma 元件 → 帶有變體屬性的可重用程式碼元件。
  4. 真實文案,真實素材。 使用設計中的確切文字。從 Figma 匯出圖示/圖片/標誌;除非素材不可用(然後註明),否則不要用庫存圖片或不同的圖示集替代。僅在階段 3A 期間允許使用佔位符。
  5. 它必須像一個真實的網站。 導航欄連結指向真實路由或帶有平滑滾動效果的 #section 錨點;按鈕/行動號召連結到某處(或列為「未接線」);手機選單打開/關閉;表單具有基本的客戶端驗證和成功狀態(無真實後端)。
  6. 小而可驗證的步驟。 建置區塊 → 驗證 → 修正。不要盲目建置整個網站然後在最後檢查。
  7. 忽略 Figma 圖層/畫框名稱——根據它的本質來命名。 Figma 名稱往往是錯誤或偷懶的(Frame 427、Group 12、一個名為 hero 的推薦區塊、五個都叫 Section 的圖層)。永遠不要將它們用於檔案名稱、元件名稱、路由、CSS 類別或 ID。相反,從內容 + 視覺角色推斷名稱:
    • 讀取節點內的實際文字、圖片和佈局。引言 + 頭像 + 姓名 → 推薦。頁面頂部的大標題 + 行動號召 → 英雄區。一排標誌 → LogoCloud。問答列表 → 常見問題。價格欄 → 定價。
    • 使用慣用名稱:元件用 PascalCase(PricingCard、TestimonialCarousel),路由/檔案/錨點用 kebab-case(/pricing、#testimonials、testimonial-carousel.tsx),token 用基於角色的名稱(color-text-muted,而不是 grey-2 或 Rectangle fill)。
    • 根據用途命名頁面(首頁、關於、個案研究詳情),而不是根據 Figma 標籤(Desktop - 7、Landing Final v3 FIX)。
    • 當 Figma 名稱與內容矛盾時,相信內容並記錄重新命名。
    • 保留 Figma 節點 ID 作為與設計的穩定連結(例如註解 // figma: 123:456),因為名稱不可靠。

Token 預算規則

上下文是有限的;將其用於重要之處。

  • 即時擷取。 在每個區塊建置之前,為該區塊節點調用 get_design_context——決不為整個頁面調用,也決不在階段 1 調用。不要重新獲取你已建置的區塊,除非它發生了變化。
  • 手機版數據等待。 在階段 4 之前,不要讀取手機/平板畫框(設計上下文或截圖)。階段 1 僅記錄手機版畫框是否存在及其節點 ID。
  • 每個區塊、每個斷點一張參考截圖。 為一個區塊獲取一次 Figma get_screenshot 並重複使用它;不要在修復循環中再次獲取它。始終按區塊(裁剪/區塊節點)截圖,而不是完整的長頁面——長頁面會被縮小並失去細節。
  • 用 DOM 測量,用截圖觀察。 僅將截圖用於視覺判斷(「它看起來像 Figma 嗎?」)。對於任何數值——溢出、位移、大小、間距、對齊——在瀏覽器中使用 JavaScript(getBoundingClientRect、getComputedStyle、scrollWidth)並報告數字。僅當 DOM 檢查發現問題時才拍攝截圖。
  • 將狀態寫入檔案,而不是聊天。 將計劃保存在 BUILD_PLAN.md(階段 1 輸出)中並原地更新。檢查點報告包含僅已變更的內容 + 剩餘差異,並連結到 BUILD_PLAN.md 而不是重複其表格。
  • 編輯,不要重寫。 透過有針對性的編輯來更改現有檔案;永遠不要為了一個小改動而重寫整個檔案。切勿將大量生成的程式碼或工具輸出貼回聊天中。
  • 原始碼中無 base64。 永遠不要將圖片嵌入為 data: URI 在你將持續編輯的檔案中(它們每次都會被重新讀取)。小圖示 → 內聯 SVG;圖片 → /public/assets 中的檔案(localhost)或上傳的 artifact 素材(artifact)。

排版比例正規化(人機互動)

設計師通常不遵循一致的排版比例(例如,一個區塊的正文字體為 14px,另一個為 15px;標題為 30 / 32 / 33px)。不要默默地修正它,也不要默默地複製它——給使用者兩者並讓使用者選擇。

  1. 審計(階段 1)。 收集桌面上使用的每一種文字樣式:字體、大小、粗細、行高、字距,附上使用次數及其使用位置(區塊名稱)。按角色對近似重複項進行分組(例如 14 + 15 → body-sm;30 + 32 + 33 → h2)。將表格寫入 BUILD_PLAN.md: 角色 | 原始設計值(次數、區塊) | 正規化值 | 原因
  2. 兩組 Token,相同 Token 名稱。 元件中的文字僅使用角色 token(--text-body-sm、--leading-body-sm、--text-h2 等),永遠不使用原始大小。將值定義兩次:
    • figma — 完全按照設計。當一個角色在 Figma 中有多個大小時,使用一個變體 token 來保持每個實例的保真度(例如 --text-body-sm = 14px,--text-body-sm-alt = 15px),以便此模式在像素上精確。
    • normalized — 每個角色一個值,對齊到一致的比例(選擇最常用的值,或者如果設計值全部散亂,則選擇一個乾淨的比例,如 1.2 / 1.25)。在此模式中,-alt token 僅指向基礎 token。 透過 <html> 上的屬性切換集合:[data-typescale="figma"] / [data-typescale="normalized"] 在 tokens.css 中。預設 = figma。
  3. 臨時 QC 開關。 新增一個小的浮動面板(元件 TypescaleSwitch,右下角,在所有內容之上):
    • 使用 Cmd + \(在 Windows/Linux 上為 Ctrl + \)切換顯示/隱藏;preventDefault 該快捷鍵。預設隱藏。
    • 分段控制 Figma | Normalized,即時切換 data-typescale,無需重新加載。
    • 顯示一個緊湊的變更列表(例如 body-sm 14/15 → 14、h2 30/32/33 → 32)。
    • 將選擇記住在 localStorage 中(包裹在 try/catch 中)。
    • 存在於自己的檔案中並安裝在一個位置,因此刪除它是一行更改。絕不影響頁面本身的佈局。
  4. 在每個檢查點可用。 在檢查點 1 和 2(以及在階段 4 之後對於手機版值),提醒使用者該開關存在並詢問使用者想要哪個變體——如果需要混合,可以按角色詢問(例如「正規化正文,保持標題與 Figma 一致」)。
  5. 在使用者決定之後: 折疊為反映使用者選擇的一組 token 值,刪除不再使用的 -alt token,更新 BUILD_PLAN.md,並在最終 QA 之前保留該開關。在交付最終版本之前,刪除開關元件及其掛載點。

網站特定規則

  • 桌面優先,確認後再處理手機版。 先建置和完善桌面斷點(主要的 Figma 桌面畫框,例如 1440)。為桌面編寫基礎樣式,稍後使用 max-width 媒體查詢(Tailwind:設定 max-* 變體或自訂桌面優先的螢幕配置)新增較小的斷點。在使用者明確確認桌面版本之前,不要開始手機/平板工作。 當開始手機版時:如果存在,則使用 Figma 手機畫框;如果不存在,則推導出合理的佈局(堆疊欄、漢堡選單、縮放類型)並將其列為假設。在斷點之間,佈局必須自然流暢(流體寬度、包裹網格)——永遠不要只是縮小。
  • 容器和網格。 從 Figma 檢測最大內容寬度和側邊內距(例如 1200px + 24px 間距)並使用一個共享的 Container 元件。
  • 語意化 HTML。 header、nav、main、section(帶有用於錨點的 id 和 aria-labelledby)、footer;每個頁面一個 h1,標題順序正確。
  • 排版。 從 Google Fonts 載入確切的字體(如果字體是自訂/付費的,則標記並使用最接近的替代字體)。當桌面和手機尺寸不同時,使用流體類型(clamp())。
  • 圖片。 正確的寬高比、根據上下文提供的 alt 文字、折疊線以下的 loading="lazy"、圖示/標誌使用 SVG。
  • 動畫。 僅重現 Figma 中設計或註解的動畫(懸停、滾動揭示、輪播)。尊重 prefers-reduced-motion。
  • 基本 SEO 元資料。 每個頁面有 <title> 和 <meta name="description">,如果未指定,則從英雄區文案中提取。

工作流程

階段 1 — 映射設計(僅輕度讀取)

  1. 使用檔案鍵和簡短的任務描述 create_session;在所有後續調用中重複使用此 sessionId。
  2. 對範圍內的頁面執行 get_metadata(將深度限制為頁面 → 區塊 → 第一級子節點)→ 找到每個桌面頁面畫框及其內部的每個區塊(節點 ID、大小、原始 Figma 名稱)。僅透過節點 ID 記錄手機版畫框。
  3. 每個桌面區塊(非每個完整頁面)一次 get_screenshot → 使用它來理解內容並決定語意名稱(規則 7)。這些是稍後重複使用的參考截圖。
  4. get_variable_defs → 提取顏色、排版、間距、圓角、效果 token;同時記錄容器寬度和網格。
  5. 排版比例審計(參見排版比例正規化):使用的每種文字樣式,按角色分組,附帶原始設計值與正規化值。未由變數涵蓋的文字樣式來自 metadata/文字節點。
  6. 從 metadata 讀取原型互動/註解 → 建置一個連結映射。
  7. 盤點素材——尚未下載。 列出每個圖示、標誌、圖片和插圖:節點 ID、語意檔案名稱(例如 hero-dashboard.png、icon-arrow-right.svg)、格式、渲染尺寸和寬高比。

將所有這些寫入 BUILD_PLAN.md:

  • 網站地圖:頁面 → 有序的區塊列表(附帶節點 ID)
  • 重新命名映射:Figma 名稱 → 語意名稱(節點 ID)— 原因,例如 "hero" → Testimonials (12:345) — 包含 3 張附有頭像的引言卡
  • 斷點映射:哪些區塊有手機版畫框(節點 ID)以及哪些區塊需要推導佈局 — 尚無手機版詳細資訊
  • Token 列表 + 容器/網格值
  • 排版比例審計表(原始設計值與正規化值,按角色)
  • 共享元件列表(附帶變體)
  • 連結映射
  • 素材清單(尚未下載)
  • 假設與差距

然後向使用者顯示一個簡短摘要(頁面/區塊數量、值得注意的重新命名、不一致的角色數量、主要假設),並附上 BUILD_PLAN.md 的連結,然後等待使用者在進入階段 2 之前確認。

階段 2 — 搭建框架

如果目標 = localhost:

  • 使用選擇的技術棧搭建專案。每個頁面一條路由;錨點用於頁內區塊。
  • 資料夾結構:src/pages/、src/sections/、src/components/、src/styles/tokens.css(+ Tailwind 主題映射)、src/qc/TypescaleSwitch.tsx。
  • tokens.css 包含兩個排版比例集合(figma + normalized);在根佈局中安裝一次 TypescaleSwitch。
  • 建立 .claude/launch.json 並使用 preview_start 啟動開發伺服器,以便它在瀏覽器窗格中開啟。

如果目標 = artifact:

  • 自包含的 HTML 頁面(內聯 CSS/JS)。僅來自允許 CDN(使用固定版本)的外部腳本(例如來自 cdnjs/jsdelivr/unpkg 的 [email protected]);透過 Google Fonts 載入字體。
  • 圖示/標誌作為內聯 SVG;圖片作為上傳的 artifact 素材(無 base64)。
  • 透過雜湊路由實現多頁面(#/、#/about、#/pricing);頁內錨點仍平滑滾動。
  • 兩種排版比例集合都存在於頁面的 <style> 中;TypescaleSwitch 是一個自包含的區塊(一個 <div> + 一個 <script>),易於刪除。
  • 最終版本(階段 4 之後)必須能在手機寬度下正常工作,無水平滾動;在桌面階段,它可能在小螢幕上看起來像桌面佈局。
  • 使用 Artifact 工具發布;對於每次迭代,編輯同一個檔案並重新發布到相同路徑。

階段 3A — 使用佔位符建置桌面佈局(逐頁、逐區塊、從上到下)

  1. 首先建置共享外殼:Navbar、Footer、Container(目前僅限桌面)。
  2. 對於每個區塊:調用該區塊節點的 get_design_context,然後使用 Flexbox/Grid 建置桌面佈局,以鏡像 Figma 自動佈局(方向、間距、內距、對齊、伸縮/填充)。應用 token(顏色、字體、間距)和真實文案。
  3. 為清單中的每個素材使用佔位符:一個具有確切寬度/高度或 aspect-ratio、相同圓角、並標有其語意檔案名稱的中性色框。例如:
    <div class="asset-placeholder" data-asset="hero-dashboard.png" style="width:…; height:…; border-radius:…;">
      <span>hero-dashboard.png</span>
    </div>
    
  4. 在網路請求面板中運行 get_screenshot 並進行目視比對。如果 80% 以上的元素在相同位置具有相同大小、內距和半徑,則繼續進行下一個區塊。否則,修正差異並重新檢查。
  5. 每個區塊完成後,向使用者顯示一個檢查點報告:該區塊的截圖、已下載/使用的素材數量、已修正的任何差異、目前的假設。
  6. 完成所有區塊後,要求使用者審查桌面版本。等待使用者的「通過」才能繼續。

階段 3B — 導入素材並完善桌面

  1. 使用 download_assets 下載階段 1 中盤點的所有圖示、標誌、圖片和插圖。
  2. 將它們逐一放入佈局中,移除佔位符。如果某個素材無法下載(例如,受保護的圖片、缺少匯出設定),則使用一個語意預留位置(相關的 SVG 或高品質佔位符)並記錄缺失的素材。
  3. 調整 object-fit、object-position 和背景大小以使素材與設計完全吻合。
  4. 完善懸停/焦點/活動狀態。為互動元素(按鈕、連結、表單輸入、選單項目)新增基本的 CSS 過渡。
  5. 為整個頁面拍攝最終的桌面截圖並執行最終的視覺檢查。向使用者顯示完整的桌面版本,並等待前進到手機版本的批准。

階段 4 — 響應式設計與完善

  1. 僅在使用者要求時才開始。 審查階段 1 的斷點映射,取得每個區塊手機版畫框的設計上下文,並將圖層映射到其桌面對應項。
  2. 為每個區塊新增手機版本:為需要不同佈局的區塊使用媒體查詢。對於其區塊沒有手機版畫框的部分,推導出合理的佈局(單列、漢堡選單、縮小字體)。
  3. 將打字/間距/佈局 token 調整為手機版本。確保 TypescaleSwitch 在手機上也能正常運作。
  4. 測試平板尺寸(768-1024px)並根據需要進行調整,確保所有尺寸之間流暢過渡。
  5. 執行最終的跨斷點 QA:檢查溢出、水平滾動、文字截斷、圖片比例和互動(選單、表單、輪播)。獲取所有頁面和斷點的截圖。

階段 5 — 交付與清理

  1. 提供最終 QA 報告:已完成的內容、剩餘的差距或假設、已知問題。
  2. 在交付前,折疊排版比例選擇(如果要求使用者已做出最終決定),移除 TypescaleSwitch 及其掛載點,清理註解。
  3. 如果目標是 artifact:重新發布最終版本。
  4. 如果目標是 localhost:確保 .claude/launch.json 有效且 dev server 正在執行。
  5. 提供一個簡短的摘要:頁面數量、區塊數量、已使用的素材數量、任何有趣的設計決策。

有用的 Figma MCP 工具

此技能依賴 Figma MCP 伺服器提供的以下工具:

  • create_session(fileKey, taskDescription) — 為持續工作階段建立一個 session。
  • get_metadata(fileKey, pageNodeIds?, depth?) — 獲取頁面和節點結構。
  • get_design_context(fileKey, nodeIds, sessionId?) — 為特定節點獲取詳細設計屬性(顏色、文字、間距)。
  • get_screenshot(fileKey, nodeId, scale?, sessionId?) — 獲取指定節點的截圖。
  • get_variable_defs(fileKey, sessionId?) — 提取設計 token(顏色、排版、效果)。
  • download_assets(fileKey, nodeIds, format?, scale?, sessionId?) — 下載圖片/圖示素材。

相關技能