> Starting from version 0.4.0, STDF supports switching between multiple themes.
## Light and dark modes
### Configuration
To use the dark mode configuration of Tailwind CSS, please configure `darkMode: 'class'` in `tailwind.config.js`, refer to [Dark Mode](https://tailwindcss.com/docs/dark-mode).
### Switching
Starting from version 0.4.0, STDF puts the method of switching between light and dark modes in the STDF NPM package, which is essentially to add or remove the `dark` class name to the `html` tag.
```javascript
// Import darkMode, pass false to switch to light mode, pass no parameters or pass true to switch to dark mode.
import { darkMode } from 'stdf/theme';
// Switch to light mode
darkMode(false);
// Switch to dark mode
darkMode();
```
## Multiple themes
### Introduction
Starting from version 0.4.0, STDF supports switching between multiple themes. The theme currently supports switching [color systems](/#/guide?nav=color), and it is considered that font, spacing, text size and other configurations can also follow the theme switching. The essential principle is to set some attributes as CSS variables, and modify these variables to achieve theme switching.
### Configuration
Please refer to the theme generator to generate the theme configuration format and configure the theme. The theme configuration must include the `name` and `color` attributes. The `name` is the theme name, and the `color` is the color matching of this theme. The default theme configuration is as follows:
> You can go to the Theme Generator to quickly configure the color system and generate the configuration file.
```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
],
},
}
```
According to the Tailwind rules, the `primary/50` this kind of transparency writing method is supported by using CSS variables at the same time. When configuring `theme.extend.colors` in `tailwind.config.js`, hexadecimal cannot be used, and the writing method with alpha channel must be used. STDF uniformly adopts the rgba writing method. You need to **pay special attention to the initial CSS variables, you only need to list the three values of rgb**, refer to [Using CSS variables](https://tailwindcss.com/docs/customizing-colors#using-css-variables).
```css
/* ✅ ✅ This writing method is correct */
:root {
--color-primary: 255 115 179;
--color-dark: 111 114 185;
}
```
```css
/* ❌ ❌ This writing method is wrong */
:root {
--color-primary: rgb(255 115 179);
--color-secondary: rgb(111 114 185);
}
```
According to the color system's color matching, plus the basic black, white, gray, and transparency, when configuring `theme.extend.colors` in `tailwind.config.js`, at least the following contents must be included:
```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',
// ...
};
```
Finally, add the initial theme CSS variables in the global style, such as `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;
}
}
```
> Please note that the CSS variable names here must be consistent with the color system configuration in `tailwind.config.js`, otherwise the theme cannot be switched.
### Switching
Import the theme configuration file and the switchTheme method in the NPM package of STDF to switch the theme, and pass in the theme file object.
```javascript
// Import STDF theme configuration file and switch theme method (stdf NPM package contains a stdf theme configuration file)
import { stdfTheme, switchTheme } from 'stdf/theme';
// Import custom theme configuration file, assuming customTheme is a custom theme configuration file
import customTheme from './customTheme';
// Switch theme to STDF theme
switchTheme(stdfTheme);
// Switch theme to custom theme
switchTheme(customTheme);
```
For detailed usage, please refer to [STDF Demo](https://github.com/dufu1991/demo-stdf).
## Summary
### Light and dark modes
Use the darkMode method in the STDF NPM package directly.
### Multiple themes
1. Configure the theme CSS variables in the entry CSS file, such as `src/app.css`.
2. Configure the theme color system in `tailwind.config.js`.
3. Go to the theme generator to configure the color system and generate the theme configuration file.
4. Import the theme configuration file and the switch theme method where you need to switch the theme, and call the switch theme method.
> Of course, if you don’t need to switch themes, you only need to configure the initial CSS variables and configure the color system in `tailwind.config.js`.