把 token 當佔位符,由 ThemeProvider 在邊界注入一條規則

Linear 的 theme 是生成的,不是手寫的:

  • 輸入是 base color、accent color、contrast 幾個參數。
  • 在 LCH 空間推導出一百多個顏色變數。
  • 選取一列時不是換背景色,而是用被選取的背景當新的 base 重新生成整個 theme,讓 label、border、控制項全部重新推導。focus、menu、elevated surface 比照辦理,各自用巢狀 ThemeProvider scope 到自己的 subtree。

這個模型和 StyleX 內建的 theming 不合。做法是把 token 降級成佔位符:

// 1. 元件照常對普通 token 寫樣式(這些 token 只是佔位符)
const vars = stylex.defineVars({ bg: '...', text: '...' })

// 2. ThemeProvider 取出 StyleX 產生的 hashed custom-property 名稱
// 3. 為每個生成的 theme 注入一條 CSS 規則,scope 在 provider 邊界上
//    → theming 模型不變,其餘樣式系統移出渲染路徑

要點是切分:只有「哪些變數值要生效」留在 runtime,樣式本身仍然在建置期算完。

相關:樣式契約要用工具強制,逃生門要明示且有 scope、能在建置期算完,代表樣式不依賴執行期的任意值