> 从 0.4.0 版本开始,STDF 支持多主题切换。 ## 亮暗模式 ### 配置 使用 Tailwind CSS 的暗模式配置,请在 `tailwind.config.js` 配置 `darkMode: 'class'`,参考 [Dark Mode](https://tailwindcss.com/docs/dark-mode)。 ### 切换 从 0.4.0 版本开始,STDF 将切换亮暗模式的方法置于 STDF 的 NPM 包中,本质上是直接给 `html` 标签添加或删除 `dark` 类名。 ```javascript // 引入 darkMode,传入 false 切换为亮模式,不传参或传入 true 切换为暗模式。 import { darkMode } from 'stdf/theme'; // 切换为亮模式 darkMode(false); // 切换为暗模式 darkMode(); ``` ## 多主题模式 ### 介绍 从 0.4.0 版本开始,STDF 支持多主题切换,主题暂支持切换[颜色系统](/#/guide?nav=color),后续考虑字体、间距、文字大小等配置也可跟随主题切换。本质原理是将一些属性设置为 CSS 变量,通过修改这些变量实现主题切换。 ### 配置 请参考主题生成器生成的主题配置格式配置好主题,主题配置须包含 name 与 color 两个属性,name 为主题名称,color 为此主题搭配的颜色。默认主题配置如下: > 可到主题生成器快速配置颜色系统并生成配置文件。 ```javascript { name: 'STDF', color: { primary: { 50: '245, 248, 255', // #F5F8FF 100: '232, 238, 255', // #E8EEFF 200: '187, 203, 254', // #BBCBFE 300: '143, 165, 253', // #8FA5FD 400: '99, 124, 253', // #637CFD 500: '55, 81, 252', // #3751FC default: '11, 36, 251', // #0B24FB 700: '7, 20, 207', // #0714CF 800: '4, 9, 164', // #0409A4 900: '1, 1, 120', // #010178 950: '3, 0, 77', // #03004D }, dark: { 50: '255, 254, 245', // #FFFEF5 100: '255, 251, 232', // #FFFBE8 200: '255, 244, 199', // #FFF4C7 300: '255, 234, 166', // #FFEAA6 400: '255, 222, 133', // #FFDE85 500: '255, 209, 100', // #FFD164 default: '255, 192, 67', // #FFC043 700: '210, 148, 41', // #D29429 800: '166, 108, 22', // #A66C16 900: '121, 72, 8', // #794808 950: '77, 41, 0', // #4D2900 }, primaryBlack: '1, 3, 25', // #010319 primaryWhite: '242, 242, 243', // #F2F2F3 darkBlack: '25, 17, 1', // #191101 darkWhite: '243, 242, 242', // #F3F2F2 functional: { success: '17, 187, 141', // #11bb8d warning: '185, 80, 0', // #b95000 error: '218, 20, 20', // #da1414 info: '46, 90, 172', // #2e5aac }, extend: [ { color: '0, 172, 238', alias: "Twitter" }, // #00acee { color: '255, 105, 55', alias: "Svelte" }, // #ff6937 { color: '0, 112, 74', alias: "Starbucks" }, // #00704a ], }, } ``` 按照 Tailwind 的规定,使用 CSS 变量同时支持 `primary/50` 这种透明度写法,在 `tailwind.config.js` 中配置 `theme.extend.colors` 时不能使用十六进制,必须使用带有 alpha 通道写法,STDF 统一采用 rgba 写法。需要**特别注意初始 CSS 变量时只需要将 rgb 的三个值列举出来**,参考 [Using CSS variables](https://tailwindcss.com/docs/customizing-colors#using-css-variables)。 ```css /* ✅ ✅ 这种写法是对的 */ :root { --color-primary: 255 115 179; --color-dark: 111 114 185; } ``` ```css /* ❌ ❌ 这种写法是错的 */ :root { --color-primary: rgb(255 115 179); --color-secondary: rgb(111 114 185); } ``` 按照颜色系统的配色,加上基础的黑、白、灰、透明,在 `tailwind.config.js` 中配置 `theme.extend.colors` 时至少包含以下内容: ```javascript /** @type {import('tailwindcss').Config} */ // ... module.exports = { // ... theme: { colors: { primary: { 50: 'rgba(var(--theme-color-primary-50), )', 100: 'rgba(var(--theme-color-primary-100), )', 200: 'rgba(var(--theme-color-primary-200), )', 300: 'rgba(var(--theme-color-primary-300), )', 400: 'rgba(var(--theme-color-primary-400), )', 500: 'rgba(var(--theme-color-primary-500), )', DEFAULT: 'rgba(var(--theme-color-primary), )', 700: 'rgba(var(--theme-color-primary-700), )', 800: 'rgba(var(--theme-color-primary-800), )', 900: 'rgba(var(--theme-color-primary-900), )', 950: 'rgba(var(--theme-color-primary-950), )', }, dark: { 50: 'rgba(var(--theme-color-dark-50), )', 100: 'rgba(var(--theme-color-dark-100), )', 200: 'rgba(var(--theme-color-dark-200), )', 300: 'rgba(var(--theme-color-dark-300), )', 400: 'rgba(var(--theme-color-dark-400), )', 500: 'rgba(var(--theme-color-dark-500), )', DEFAULT: 'rgba(var(--theme-color-dark), )', 700: 'rgba(var(--theme-color-dark-700), )', 800: 'rgba(var(--theme-color-dark-800), )', 900: 'rgba(var(--theme-color-dark-900), )', 950: 'rgba(var(--theme-color-dark-950), )', }, primaryBlack: 'rgba(var(--theme-color-primaryBlack), )', primaryWhite: 'rgba(var(--theme-color-primaryWhite), )', darkBlack: 'rgba(var(--theme-color-darkBlack), )', darkWhite: 'rgba(var(--theme-color-darkWhite), )', success: 'rgba(var(--theme-color-functional-success), )', warning: 'rgba(var(--theme-color-functional-warning), )', error: 'rgba(var(--theme-color-functional-error), )', info: 'rgba(var(--theme-color-functional-info), )', extend0: 'rgba(var(--theme-color-extend0), )', extend1: 'rgba(var(--theme-color-extend1), )', extend2: 'rgba(var(--theme-color-extend2), )', black: '#000000', white: '#ffffff', gray: { 50: '#f2f2f2', 100: '#e6e6e6', 200: '#cccccc', 300: '#b3b3b3', 400: '#999999', 500: '#808080', 600: '#666666', 700: '#4D4D4D', 800: '#333333', 900: '#1A1A1A', 950: '#0D0D0D', }, transparent: 'transparent', // ... }, // ... }, darkMode: 'class', // ... }; ``` 最后在全局样式增加初始主题的 CSS 变量,如在 `src/app.css` 中配置如下: ```css @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --theme-color-primary-50: 245, 248, 255; --theme-color-primary-100: 232, 238, 255; --theme-color-primary-200: 187, 203, 254; --theme-color-primary-300: 143, 165, 253; --theme-color-primary-400: 99, 124, 253; --theme-color-primary-500: 55, 81, 252; --theme-color-primary: 11, 36, 251; --theme-color-primary-700: 7, 20, 207; --theme-color-primary-800: 4, 9, 164; --theme-color-primary-900: 1, 1, 120; --theme-color-primary-950: 3, 0, 77; --theme-color-dark-50: 255, 254, 245; --theme-color-dark-100: 255, 251, 232; --theme-color-dark-200: 255, 244, 199; --theme-color-dark-300: 255, 234, 166; --theme-color-dark-400: 255, 222, 133; --theme-color-dark-500: 255, 209, 100; --theme-color-dark: 255, 192, 67; --theme-color-dark-700: 210, 148, 41; --theme-color-dark-800: 166, 108, 22; --theme-color-dark-900: 121, 72, 8; --theme-color-dark-950: 77, 41, 0; --theme-color-primaryBlack: 1, 3, 25; --theme-color-primaryWhite: 242, 242, 243; --theme-color-darkBlack: 25, 17, 1; --theme-color-darkWhite: 243, 242, 242; --theme-color-functional-success: 17, 187, 141; --theme-color-functional-warning: 185, 80, 0; --theme-color-functional-error: 218, 20, 20; --theme-color-functional-info: 46, 90, 172; --theme-color-extend0: 0, 172, 238; --theme-color-extend1: 255, 105, 55; --theme-color-extend2: 0, 112, 74; } } ``` > 请注意,这里的 CSS 变量名必须与 `tailwind.config.js` 中的颜色系统配置一致,否则无法切换主题。extend 数量不限,但不同主题的 extend 数量必须一致。 ### 切换 引入 NPM 包中的 switchTheme 方法切换主题,传入主题文件对象即可。 ```javascript // 引入 STDF 主题配置文件和切换主题方法(stdf 的 NPM 包中包含一个 stdf 主题配置文件) import { stdfTheme, switchTheme } from 'stdf/theme'; // 引入自定义主题配置文件,假定 customTheme 为自定义主题配置文件 import customTheme from './customTheme'; // 切换主题为 STDF 主题 switchTheme(stdfTheme); // 切换主题为自定义主题 switchTheme(customTheme); ``` 详细使用方式可参考 [STDF Demo](https://github.com/any-tdf/demo-stdf)。 ## 总结 ### 亮暗模式 直接使用 STDF 的 NPM 包中的 darkMode 方法即可。 ### 多主题模式 1. 在入口 CSS 文件内配置主题 CSS 变量,如 `src/app.css`。 2. 在 `tailwind.config.js` 中配置主题颜色系统。 3. 到主题生成器中配置颜色系统并生成主题配置文件。 4. 在需要切换主题的地方引入主题配置文件和切换主题方法,调用切换主题方法。 > 当然,如果你不需要切换主题,只需要配置初始 CSS 变量并在 `tailwind.config.js` 中配置颜色系统即可。