這是 Native App 功能管線的工程向細節。白話版(給設計師):native-app.html · 契約正本(在 repo 內閱讀):design-system/HANDOFF_PROTOCOL.md · 做功能的主線(不分平台,要先讀):product-feature.html · 文件索引
ChipK 協作旅程 · Design Contracts

包裹裡的那份說明書,
長什麼樣

設計師交出去的是「包裹」,工程端收到的是「規格」。這頁講的就是中間那份規格:它包含什麼、既有的原生元件怎麼接上、要和工程師先定下哪些事。

設計師 AI 工程師

出發前:這是哪一段的說明

Native App 旅程裡,交接日的包裹有三樣東西:一個網址、一個版本號、一份說明書。這一頁講的是那份說明書——它的正式名字叫 Design Contract(設計規格書)。

它把 Figma、設計系統文件、Storybook 元件、Prototype UI Flow 轉成 Web、iOS、Android 都能理解的規格。Native app 不需要直接讀 React 或 Storybook DOM,而是讀穩定、版本化、可驗證的規格。

它是什麼、不是什麼

先把最常見的兩個誤解排掉,後面的細節才好談。

一句話:Design Contract 就是 UI 的 API contract

你已經熟悉的

API contract

定義後端會給什麼資料、前端要怎麼接。雙方各自實作,但對外能力保持一致。

這頁在講的

Design contract

定義設計系統裡的元件、token、流程,工程端要怎麼實作與驗證。同樣是各自實作、對外一致。

它不是 runtime 連線

Storybook 裡的 Button 不會直接呼叫 iOS app 裡的 Button。規格書是 mapping 加上規格,不是跨平台執行橋

不是這樣

遠端控制

Storybook Button 直接連到 iOS 的 ChipKButton 並控制它。

而是這樣

各自實作,逐項對得上

Storybook 的 button 規格在 iOS 由 ChipKButton 承接,並確認 props、states、tokens、a11y 都對得上。

整體流程:規格書坐在中間

Storybook 是給人 review 的介面;Design Contract 是跨平台交接層;native team 保有平台實作主導權

設計來源Figma 設計稿、元件庫、Variables
抽取Design System Docs tokens、元件規格、證據地圖
驗證Storybook 元件狀態、互動、Prototype
交接Design Contracts 平台中立、可機器讀取
實作iOS / Android SwiftUI、UIKit、Compose、View;AI 接棒用 /native-product-implementation

換來的優勢

  • 不被綁住iOS / Android 用平台最好的方式實作,不必照抄 React
  • 可驗證規格是機器可讀的,對不對得上有明確答案
  • 落差看得見gap report 把「做不到的地方」寫成紀錄,不是口頭抱怨
  • 改版便宜token 改一次,Web 與 native 一起換
  • 可以慢慢來既有元件先 mapping,不必一次全部重寫

核心原則

  • Storybook 負責讓人 review。設計師和 PM 在這裡確認「長什麼樣、怎麼流動」。
  • Design Contract 負責讓機器和跨平台團隊交接。平台中立、版本化、可驗證。
  • Native app 負責用平台最佳方式實作。這樣可以加速交付,又不會讓 iOS / Android 被 React 實作綁住。
工程師消費

規格裡有六件事

一顆元件的規格書固定回答六個問題。少一項,工程端就得靠猜——而猜出來的東西,驗收時一定對不上。

Button 的規格範例

id: button
storybookSource: components-button--primary
nativeName:
  ios: ChipKButton
  android: ChipKButton
props:
  variant: [primaryFill, primaryOutline]
  size: [tiny, small, medium, large]
  disabled: boolean
slots:
  leadingIcon: IconName
  label: string
tokens:
  cornerRadius: --cm-comp-button-corner-radius
  labelColor: --cm-comp-button-primary-fill-default-label-color
accessibility:
  iconOnlyRequiresLabel: true
events:
  press: button.click

提醒:這份規格讓 Storybook、iOS、Android 用完全不同的技術實作,但對外能力保持一致——這正是驗收時能拿真機截圖和 Storybook 並排比對的原因。

你可以這樣對 AI 開口
幫 Button 和 Switch 產出 native design contract,六項都要齊:component 對應、props、tokens、a11y、events、gap report。 先講清楚「六項都要齊」,省掉之後補件的來回。
這份 contract 的 tokens 用的是 comp 層還是 ref 層?如果指到 ref,先修正 token 再重產。 規格裡混進 ref 層 token,native 那邊會抄到寫死的色碼。

背後的指令:npm run contracts:native-spike · 驗證:npm run check:native-spike

工程師主導設計師確認

如果 native 已經有元件,怎麼接

先 mapping,再決定是否 wrapper 或重做。不要一開始就要求 native 全部重寫——那會讓這件事在第一週就停擺。每顆既有元件先標一個狀態,再逐步收斂。

既有元件的 adoption mapping 範例

storybookId: button
ios:
  existingComponent: PrimaryActionButton
  status: partial
  propMap:
    variant.primaryFill: style.filled
    variant.primaryOutline: style.outline
    disabled: isEnabled = false
  unsupported:
    - trailingIcon

提醒:unsupported 不是失敗,是把已知落差寫下來。沒寫下來的落差,會在驗收時變成「怎麼跟 Demo 不一樣」的爭論。

你可以這樣對 AI 開口
把 iOS 現有的 PrimaryActionButton 和 contract 的 button 做 mapping,對不上的列進 unsupported,不要硬套。 「不要硬套」要講出來——否則 AI 會為了讓表格好看而勉強對應。
設計師工程師

建議協作方法:從小範圍開始

不要一次把整本目錄丟過去。先用少數幾顆元件跑通一輪,確認規格夠不夠用、格式對不對得上,再擴大。

  1. 先從小範圍 spike 開始——選 1–2 個元件(例如 Button、Switch、RealtimeQuoteRow),再加上一個 Prototype flow。
  2. 先輸出 tokens——讓 iOS / Android 先確認顏色、字體、間距、圓角、motion 能不能接。
  3. 再輸出 component contracts——確認 props、variants、states、slots、events、a11y 是否足夠 native 實作。
  4. 產生 native preview 或 starter——用來檢查規格是否可用,不把它當成 production app
  5. native team 回 gap report——回報缺 token、缺 prop、狀態不支援、平台行為不同、a11y 差異。

提醒:第 4 步產出的 preview 是驗證工具,不是產品。它存在的唯一目的是回答「這份規格夠不夠工程端實作」。

預覽:npm run preview:ios-native(需要 Xcode toolchain)

設計師工程師

和 native 工程師開會要定下來的事

這六件事沒定下來,規格書產出來也沒人接。一次會議就能定完——但要六項都有明確答案,不能留「之後再說」。

這六項都有答案,才算談定。談定之後才開始產規格書——否則會產出一份沒人消費的文件。這是人的決定,AI 不能代答。

記住三個確認點就好

這條線上只有三個地方需要「人」點頭。卡住的時候,通常就是卡在其中一個。

確認一

六件事談定了

開工前和 native 工程師把六件事逐項定完,才開始產規格。(第 4 站)

確認二

spike 跑通了

一兩顆元件先跑一輪,工程端確認規格夠用,才擴大範圍。(第 3 站)

確認三

落差寫下來了

對不上的地方進 gap report,不是口頭講講。(第 1、2 站)

誰負責什麼

四層各有各的產出。界線清楚,才不會出現「這應該是你做的吧」。

層 ↓ 負責內容 產出
設計 / Design System Figma source、tokens、元件規格、狀態、互動規則。 design-system/ 文件與 token files。
Storybook 元件 review、狀態展示、Prototype、UI Flow、資料 contract。 stories、component catalog、prototype metadata。
Design Contract 把設計系統轉成平台中立規格。 component JSON、token JSON、native mapping、gap report。
Native team 平台原生元件、手勢、focus、a11y、haptics、navigation。 SwiftUI / UIKit / Compose / Android View implementation。AI 接棒時用 /native-product-implementation(示範資料組裝)→ /production-data-integration(真資料)。

出門前的備忘卡

每個角色只要記得自己這張。

設計師

  • 規格書的來源是目錄——目錄乾淨,規格才乾淨
  • 確認六項規格內容齊全才定版
  • 收 gap report、修正目錄、出小版本
  • 不用讀 SwiftUI / Compose 程式碼

AI

  • 從 Storybook 與 tokens 產出平台中立規格
  • 產 adoption mapping,把落差寫進 gap report
  • 不捏造 native 元件名稱,對不上就標 unsupported

工程師

  • 六件事沒談定,先別開始接規格
  • 既有元件先 mapping,不要一開始就重寫
  • 平台行為(手勢、a11y、導覽)由你決定
  • 對不上就回 gap report,不要私下改規格
  • 讓 AI 接棒就用 /native-product-implementation;contract 是它的規格書,不是免審通行證

白話版?給設計師看的整趟旅程在 native-app.html——這一頁是它第 3 站「交接日」的工程向展開。

正式契約?定版規則、責任分工、勘誤單格式在 design-system/HANDOFF_PROTOCOL.md;為什麼同步是單向的,看 design-system/NATIVE_SYNC_ARCHITECTURE.md

接棒實作的 AI 指令?/native-product-implementation(組 App,示範資料)與 /production-data-integration(接真資料)的輸入、把關與地雷,見 docs/workflows/product-feature.md〈階段 3〉〈階段 4〉。規格書(contract)是它們的元件層輸入之一,不取代七份交接文件。

skill 正本?兩支都在 GitHub harrychuang-cm/skills(上面的指令名都可以點);情境說明在 CM Skills 圖解指南。本專案的 skill 清單與安裝方式:docs/guides/skills.md

背後的指令:npm run contracts:native-spike(產規格)・npm run check:native-spike(驗證)・npm run preview:ios-native(iOS 預覽,需 Xcode)。產出範圍見 design-contracts/README.md