深淺主題 (Theming)
- 文章發表於
深色與淺色主題近年來幾乎已成為網站的標配,從個人部落格到客戶端應用(例如:GitHub),皆有提供切換深淺色主題的功能,讓用戶能依照個人喜好自由選擇介面風格。
而要實現網站主題的無痛切換,我認為最重要的原則是:在開發時,以〈設計標籤〉作為 CSS 參數的基石。在先前的章節〈從設計標籤到 CSS〉 中,我們已介紹過其帶來的好處。如果產品色碼未被納入設計標籤 (Design Token) 內,就必須在應用層的 CSS 中額外處理,這在日後更改顏色時會增添不必要的麻煩。
回顧
設計標籤 (Design Tokens)
在 〈設計標籤〉 一文中,我們介紹了設計標籤的基本概念。其中,透過 System Token(alias.json
)的深淺主題配置,分別對應到不同的 Reference Token(base.json
),這樣的設計使我們能根據不同條件,動態地將同一個 System Token 解析為不同的值。
標準化 CSS (Normalized CSS)
接著,在 Style Dictionary 建構設計標籤的過程中,其會將 :root
中的變數根據主題拆分為 light
與 dark
,並整理到 normalized.css
(Source Code)。並將這份 CSS 檔放在 <head>
內讓網頁載入時引入其檔案。在透過 data-theme
屬性來控制使用哪一組主題色。
Style Dictionary 的實際輸出結構:
/* 建議的結構 - 優先使用系統偏好設定 *//* 深色主題(預設) */:root {--your-design-system-sys-color-primary: #D0BCFF;--your-design-system-sys-color-background: #141218;--your-design-system-sys-color-on-background: #E6E0E9;/* ... 其他深色主題 tokens */}/* 淺色主題 */html[data-theme='light'], .your-design-system-light {--your-design-system-sys-color-primary: #6750A4;--your-design-system-sys-color-background: #FEF7FF;--your-design-system-sys-color-on-background: #1D1B20;/* ... 其他淺色主題 tokens */}
以下我們將會介紹如何實作讓使用者可以切換深淺色模式的功能,也就是本篇要介紹的 useTheme
Hook。
useTheme
描述
useTheme
的核心功能是控制 data-theme
屬性的值,同時提供主題狀態管理和持久化儲存功能。
API
理想上我們希望當使用 useTheme
時,可以讓我們更新 data-theme
以及取得當前的 theme
狀態。
import { useTheme } from '@tocino-ui/core/hooks'export default () => {const { theme, resolvedTheme, toggleTheme, setTheme } = useTheme()return (<div><span>Current Theme: {theme}</span><span>Resolved Theme: {resolvedTheme}</span><button onClick={toggleTheme}>Toggle Theme</button><button onClick={() => setTheme('system')}>Use System Theme</button></div>)}
參數
回傳 API
實作
可以看到上面引入了我們先前做的 Button 組件,並且透過 useTheme
去控制 data-theme
的值,這樣就可以讓設計系統能夠支援切換深淺色主題。