@@ -12,7 +12,7 @@ brief: Use TailwindCSS and Semi more elegantly
1212
1313<br />
1414
15- This page will provide best practices for some issues encountered when using atomic style libraries such as TailwindCSS (only v3, Tailwind V4 is not supported yet ) with Semi.
15+ This page will provide best practices for some issues encountered when using atomic style libraries such as TailwindCSS (supports both v3 and v4 ) with Semi.
1616
1717These problems are often encountered when other component libraries are used with Tailwind, but Semi provides official solutions. It is recommended to follow the instructions in this article to configure the project correctly.
1818
@@ -86,7 +86,36 @@ For users who use neither webpack or rspack build, please refer to the principle
8686
8787** 3. Modify Tailwind entry configuration**
8888
89- The CSS of Tailwind entry is usually a file containing the following three lines
89+ <Notice title =" Choose your Tailwind version " >
90+ The configuration methods for Tailwind v3 and v4 are different. Please choose the corresponding configuration method based on the version you are using.
91+ </Notice >
92+
93+ ** Tailwind v4 Configuration:**
94+
95+ 1 . Create a CSS file (e.g., ` semi-layer.css ` ) with the following content:
96+ ``` css
97+ @layer theme, base, semi, utilities;
98+ ```
99+
100+ 2 . Import this file at the ** very top** of your project's JS entry file (e.g., ` main.tsx ` , ` App.tsx ` , or ` index.js ` ), before all other import statements:
101+
102+ ``` js
103+ // main.tsx or index.js - must be at the very top
104+ import ' ./semi-layer.css' ; // must be first
105+ import ' ./tailwind.css' ; // file containing @import "tailwindcss";
106+ import { Button } from ' @douyinfe/semi-ui' ;
107+ // ... other imports
108+ ```
109+
110+ <Notice type =" warning " title =" Important " >
111+ ` semi-layer.css ` must be imported before any CSS file containing ` @import "tailwindcss"; ` and before any Semi component imports, otherwise the CSS Layer order will be incorrect. It is recommended to place it on the first line of the entry file.
112+ </Notice >
113+
114+ ---
115+
116+ ** Tailwind v3 Configuration:**
117+
118+ The CSS of Tailwind v3 entry is usually a file containing the following three lines
90119``` css
91120@tailwind base;
92121@tailwind components;
@@ -129,17 +158,337 @@ The meaning of the above CSS is that base (including Preflight) has the lowest p
129158
130159### 2. Solve the problem of using Semi Token in Tailwind atomic class (optional)
131160
132- Tailwind supports users to configure their own Token to implement themes. At the same time, Semi also provides its own theme solution and corresponding Token
133- If you want to use Semi Token directly in the project, for example, set the text color of a span to ` --semi-color-text-0 ` to automatically switch between light and dark colors to be consistent with the theme, you need to set the css ` color separately : var(--semi-color-text-0) ` , very inconvenient.
161+ Tailwind supports users to configure their own Token to implement themes. At the same time, Semi also provides its own theme solution and corresponding Token.
162+ If you want to use Semi Token directly in the project, for example, set the text color of a span to ` --semi-color-text-0 ` to automatically switch between light and dark colors to be consistent with the theme, you need to set the css ` color: var(--semi-color-text-0) ` separately, which is very inconvenient.
134163
135164Semi provides Tailwind's theme configuration file, which is used to map Semi's Token to atomic Token. For the above requirements, you can directly set ` text-semi-color-text-0 ` for span.
136165
137- Just configure the following content in the Tailwind configuration (i.e. ` tainwind.config.js ` ):
166+ <Notice title =" Choose your Tailwind version " >
167+ The theme configuration methods for Tailwind v3 and v4 are different. Please choose the corresponding configuration method based on the version you are using.
168+ </Notice >
169+
170+ ** Tailwind v4 Configuration:**
171+
172+ In your Tailwind entry CSS file (the file containing ` @import "tailwindcss"; ` ), add the ` @theme ` configuration:
173+
174+ ``` css
175+ @import " tailwindcss" ;
176+
177+ /* *
178+ * Semi Design Token integration with Tailwind CSS v4
179+ *
180+ * How it works:
181+ * 1. Use var(--semi-xxx) as placeholders in @theme to let Tailwind generate utility classes
182+ * (var() in @theme won't be resolved at build time, only serves as placeholder)
183+ * 2. Redefine these variables in body selector, pointing to Semi's actual tokens
184+ * (Use body instead of :root to ensure it takes effect after Semi injects :root variables)
185+ *
186+ * Usage examples:
187+ * bg-semi-color-primary -> Primary color background
188+ * text-semi-color-text-0 -> Primary text color
189+ * rounded-semi-border-radius-medium -> Medium border radius
190+ */
191+
192+ @theme {
193+ /* ========== Base Colors ========== */
194+ --color-semi-color-white: var(--semi-color-white);
195+ --color-semi-color-black: var(--semi-color-black);
196+
197+ /* ========== Primary Colors ========== */
198+ --color-semi-color-primary: var(--semi-color-primary);
199+ --color-semi-color-primary-hover: var(--semi-color-primary-hover);
200+ --color-semi-color-primary-active: var(--semi-color-primary-active);
201+ --color-semi-color-primary-disabled: var(--semi-color-primary-disabled);
202+ --color-semi-color-primary-light-default: var(--semi-color-primary-light-default);
203+ --color-semi-color-primary-light-hover: var(--semi-color-primary-light-hover);
204+ --color-semi-color-primary-light-active: var(--semi-color-primary-light-active);
205+
206+ /* ========== Secondary Colors ========== */
207+ --color-semi-color-secondary: var(--semi-color-secondary);
208+ --color-semi-color-secondary-hover: var(--semi-color-secondary-hover);
209+ --color-semi-color-secondary-active: var(--semi-color-secondary-active);
210+ --color-semi-color-secondary-disabled: var(--semi-color-secondary-disabled);
211+ --color-semi-color-secondary-light-default: var(--semi-color-secondary-light-default);
212+ --color-semi-color-secondary-light-hover: var(--semi-color-secondary-light-hover);
213+ --color-semi-color-secondary-light-active: var(--semi-color-secondary-light-active);
214+
215+ /* ========== Tertiary Colors ========== */
216+ --color-semi-color-tertiary: var(--semi-color-tertiary);
217+ --color-semi-color-tertiary-hover: var(--semi-color-tertiary-hover);
218+ --color-semi-color-tertiary-active: var(--semi-color-tertiary-active);
219+ --color-semi-color-tertiary-light-default: var(--semi-color-tertiary-light-default);
220+ --color-semi-color-tertiary-light-hover: var(--semi-color-tertiary-light-hover);
221+ --color-semi-color-tertiary-light-active: var(--semi-color-tertiary-light-active);
222+
223+ /* ========== Default Colors ========== */
224+ --color-semi-color-default: var(--semi-color-default);
225+ --color-semi-color-default-hover: var(--semi-color-default-hover);
226+ --color-semi-color-default-active: var(--semi-color-default-active);
227+
228+ /* ========== Info Colors ========== */
229+ --color-semi-color-info: var(--semi-color-info);
230+ --color-semi-color-info-hover: var(--semi-color-info-hover);
231+ --color-semi-color-info-active: var(--semi-color-info-active);
232+ --color-semi-color-info-disabled: var(--semi-color-info-disabled);
233+ --color-semi-color-info-light-default: var(--semi-color-info-light-default);
234+ --color-semi-color-info-light-hover: var(--semi-color-info-light-hover);
235+ --color-semi-color-info-light-active: var(--semi-color-info-light-active);
236+
237+ /* ========== Success Colors ========== */
238+ --color-semi-color-success: var(--semi-color-success);
239+ --color-semi-color-success-hover: var(--semi-color-success-hover);
240+ --color-semi-color-success-active: var(--semi-color-success-active);
241+ --color-semi-color-success-disabled: var(--semi-color-success-disabled);
242+ --color-semi-color-success-light-default: var(--semi-color-success-light-default);
243+ --color-semi-color-success-light-hover: var(--semi-color-success-light-hover);
244+ --color-semi-color-success-light-active: var(--semi-color-success-light-active);
245+
246+ /* ========== Danger Colors ========== */
247+ --color-semi-color-danger: var(--semi-color-danger);
248+ --color-semi-color-danger-hover: var(--semi-color-danger-hover);
249+ --color-semi-color-danger-active: var(--semi-color-danger-active);
250+ --color-semi-color-danger-light-default: var(--semi-color-danger-light-default);
251+ --color-semi-color-danger-light-hover: var(--semi-color-danger-light-hover);
252+ --color-semi-color-danger-light-active: var(--semi-color-danger-light-active);
253+
254+ /* ========== Warning Colors ========== */
255+ --color-semi-color-warning: var(--semi-color-warning);
256+ --color-semi-color-warning-hover: var(--semi-color-warning-hover);
257+ --color-semi-color-warning-active: var(--semi-color-warning-active);
258+ --color-semi-color-warning-light-default: var(--semi-color-warning-light-default);
259+ --color-semi-color-warning-light-hover: var(--semi-color-warning-light-hover);
260+ --color-semi-color-warning-light-active: var(--semi-color-warning-light-active);
261+
262+ /* ========== Functional Colors ========== */
263+ --color-semi-color-focus-border: var(--semi-color-focus-border);
264+ --color-semi-color-disabled-text: var(--semi-color-disabled-text);
265+ --color-semi-color-disabled-border: var(--semi-color-disabled-border);
266+ --color-semi-color-disabled-bg: var(--semi-color-disabled-bg);
267+ --color-semi-color-disabled-fill: var(--semi-color-disabled-fill);
268+ --color-semi-color-shadow: var(--semi-color-shadow);
269+
270+ /* ========== Link Colors ========== */
271+ --color-semi-color-link: var(--semi-color-link);
272+ --color-semi-color-link-hover: var(--semi-color-link-hover);
273+ --color-semi-color-link-active: var(--semi-color-link-active);
274+ --color-semi-color-link-visited: var(--semi-color-link-visited);
275+
276+ /* ========== Border Colors ========== */
277+ --color-semi-color-border: var(--semi-color-border);
278+
279+ /* ========== Background Colors ========== */
280+ --color-semi-color-nav-bg: var(--semi-color-nav-bg);
281+ --color-semi-color-overlay-bg: var(--semi-color-overlay-bg);
282+ --color-semi-color-bg-0: var(--semi-color-bg-0);
283+ --color-semi-color-bg-1: var(--semi-color-bg-1);
284+ --color-semi-color-bg-2: var(--semi-color-bg-2);
285+ --color-semi-color-bg-3: var(--semi-color-bg-3);
286+ --color-semi-color-bg-4: var(--semi-color-bg-4);
287+
288+ /* ========== Fill Colors ========== */
289+ --color-semi-color-fill-0: var(--semi-color-fill-0);
290+ --color-semi-color-fill-1: var(--semi-color-fill-1);
291+ --color-semi-color-fill-2: var(--semi-color-fill-2);
292+
293+ /* ========== Text Colors ========== */
294+ --color-semi-color-text-0: var(--semi-color-text-0);
295+ --color-semi-color-text-1: var(--semi-color-text-1);
296+ --color-semi-color-text-2: var(--semi-color-text-2);
297+ --color-semi-color-text-3: var(--semi-color-text-3);
298+
299+ /* ========== Highlight Colors ========== */
300+ --color-semi-color-highlight-bg: var(--semi-color-highlight-bg);
301+ --color-semi-color-highlight: var(--semi-color-highlight);
302+
303+ /* ========== Data Visualization Colors ========== */
304+ --color-semi-color-data-0: var(--semi-color-data-0);
305+ --color-semi-color-data-1: var(--semi-color-data-1);
306+ --color-semi-color-data-2: var(--semi-color-data-2);
307+ --color-semi-color-data-3: var(--semi-color-data-3);
308+ --color-semi-color-data-4: var(--semi-color-data-4);
309+ --color-semi-color-data-5: var(--semi-color-data-5);
310+ --color-semi-color-data-6: var(--semi-color-data-6);
311+ --color-semi-color-data-7: var(--semi-color-data-7);
312+ --color-semi-color-data-8: var(--semi-color-data-8);
313+ --color-semi-color-data-9: var(--semi-color-data-9);
314+ --color-semi-color-data-10: var(--semi-color-data-10);
315+ --color-semi-color-data-11: var(--semi-color-data-11);
316+ --color-semi-color-data-12: var(--semi-color-data-12);
317+ --color-semi-color-data-13: var(--semi-color-data-13);
318+ --color-semi-color-data-14: var(--semi-color-data-14);
319+ --color-semi-color-data-15: var(--semi-color-data-15);
320+ --color-semi-color-data-16: var(--semi-color-data-16);
321+ --color-semi-color-data-17: var(--semi-color-data-17);
322+ --color-semi-color-data-18: var(--semi-color-data-18);
323+ --color-semi-color-data-19: var(--semi-color-data-19);
324+
325+ /* ========== Border Radius ========== */
326+ --radius-semi-border-radius-extra-small: var(--semi-border-radius-extra-small);
327+ --radius-semi-border-radius-small: var(--semi-border-radius-small);
328+ --radius-semi-border-radius-medium: var(--semi-border-radius-medium);
329+ --radius-semi-border-radius-large: var(--semi-border-radius-large);
330+ --radius-semi-border-radius-circle: var(--semi-border-radius-circle);
331+ --radius-semi-border-radius-full: var(--semi-border-radius-full);
332+ }
333+
334+ /* *
335+ * Runtime variable override
336+ * Use body selector to ensure it takes effect after Semi's :root variables are injected
337+ */
338+ body {
339+ /* Base Colors */
340+ --color-semi-color-white : var (--semi-color-white );
341+ --color-semi-color-black : var (--semi-color-black );
342+
343+ /* Primary Colors */
344+ --color-semi-color-primary : var (--semi-color-primary );
345+ --color-semi-color-primary-hover : var (--semi-color-primary-hover );
346+ --color-semi-color-primary-active : var (--semi-color-primary-active );
347+ --color-semi-color-primary-disabled : var (--semi-color-primary-disabled );
348+ --color-semi-color-primary-light-default : var (--semi-color-primary-light-default );
349+ --color-semi-color-primary-light-hover : var (--semi-color-primary-light-hover );
350+ --color-semi-color-primary-light-active : var (--semi-color-primary-light-active );
351+
352+ /* Secondary Colors */
353+ --color-semi-color-secondary : var (--semi-color-secondary );
354+ --color-semi-color-secondary-hover : var (--semi-color-secondary-hover );
355+ --color-semi-color-secondary-active : var (--semi-color-secondary-active );
356+ --color-semi-color-secondary-disabled : var (--semi-color-secondary-disabled );
357+ --color-semi-color-secondary-light-default : var (--semi-color-secondary-light-default );
358+ --color-semi-color-secondary-light-hover : var (--semi-color-secondary-light-hover );
359+ --color-semi-color-secondary-light-active : var (--semi-color-secondary-light-active );
360+
361+ /* Tertiary Colors */
362+ --color-semi-color-tertiary : var (--semi-color-tertiary );
363+ --color-semi-color-tertiary-hover : var (--semi-color-tertiary-hover );
364+ --color-semi-color-tertiary-active : var (--semi-color-tertiary-active );
365+ --color-semi-color-tertiary-light-default : var (--semi-color-tertiary-light-default );
366+ --color-semi-color-tertiary-light-hover : var (--semi-color-tertiary-light-hover );
367+ --color-semi-color-tertiary-light-active : var (--semi-color-tertiary-light-active );
368+
369+ /* Default Colors */
370+ --color-semi-color-default : var (--semi-color-default );
371+ --color-semi-color-default-hover : var (--semi-color-default-hover );
372+ --color-semi-color-default-active : var (--semi-color-default-active );
373+
374+ /* Info Colors */
375+ --color-semi-color-info : var (--semi-color-info );
376+ --color-semi-color-info-hover : var (--semi-color-info-hover );
377+ --color-semi-color-info-active : var (--semi-color-info-active );
378+ --color-semi-color-info-disabled : var (--semi-color-info-disabled );
379+ --color-semi-color-info-light-default : var (--semi-color-info-light-default );
380+ --color-semi-color-info-light-hover : var (--semi-color-info-light-hover );
381+ --color-semi-color-info-light-active : var (--semi-color-info-light-active );
382+
383+ /* Success Colors */
384+ --color-semi-color-success : var (--semi-color-success );
385+ --color-semi-color-success-hover : var (--semi-color-success-hover );
386+ --color-semi-color-success-active : var (--semi-color-success-active );
387+ --color-semi-color-success-disabled : var (--semi-color-success-disabled );
388+ --color-semi-color-success-light-default : var (--semi-color-success-light-default );
389+ --color-semi-color-success-light-hover : var (--semi-color-success-light-hover );
390+ --color-semi-color-success-light-active : var (--semi-color-success-light-active );
391+
392+ /* Danger Colors */
393+ --color-semi-color-danger : var (--semi-color-danger );
394+ --color-semi-color-danger-hover : var (--semi-color-danger-hover );
395+ --color-semi-color-danger-active : var (--semi-color-danger-active );
396+ --color-semi-color-danger-light-default : var (--semi-color-danger-light-default );
397+ --color-semi-color-danger-light-hover : var (--semi-color-danger-light-hover );
398+ --color-semi-color-danger-light-active : var (--semi-color-danger-light-active );
399+
400+ /* Warning Colors */
401+ --color-semi-color-warning : var (--semi-color-warning );
402+ --color-semi-color-warning-hover : var (--semi-color-warning-hover );
403+ --color-semi-color-warning-active : var (--semi-color-warning-active );
404+ --color-semi-color-warning-light-default : var (--semi-color-warning-light-default );
405+ --color-semi-color-warning-light-hover : var (--semi-color-warning-light-hover );
406+ --color-semi-color-warning-light-active : var (--semi-color-warning-light-active );
407+
408+ /* Functional Colors */
409+ --color-semi-color-focus-border : var (--semi-color-focus-border );
410+ --color-semi-color-disabled-text : var (--semi-color-disabled-text );
411+ --color-semi-color-disabled-border : var (--semi-color-disabled-border );
412+ --color-semi-color-disabled-bg : var (--semi-color-disabled-bg );
413+ --color-semi-color-disabled-fill : var (--semi-color-disabled-fill );
414+ --color-semi-color-shadow : var (--semi-color-shadow );
415+
416+ /* Link Colors */
417+ --color-semi-color-link : var (--semi-color-link );
418+ --color-semi-color-link-hover : var (--semi-color-link-hover );
419+ --color-semi-color-link-active : var (--semi-color-link-active );
420+ --color-semi-color-link-visited : var (--semi-color-link-visited );
421+
422+ /* Border Colors */
423+ --color-semi-color-border : var (--semi-color-border );
424+
425+ /* Background Colors */
426+ --color-semi-color-nav-bg : var (--semi-color-nav-bg );
427+ --color-semi-color-overlay-bg : var (--semi-color-overlay-bg );
428+ --color-semi-color-bg-0 : var (--semi-color-bg-0 );
429+ --color-semi-color-bg-1 : var (--semi-color-bg-1 );
430+ --color-semi-color-bg-2 : var (--semi-color-bg-2 );
431+ --color-semi-color-bg-3 : var (--semi-color-bg-3 );
432+ --color-semi-color-bg-4 : var (--semi-color-bg-4 );
433+
434+ /* Fill Colors */
435+ --color-semi-color-fill-0 : var (--semi-color-fill-0 );
436+ --color-semi-color-fill-1 : var (--semi-color-fill-1 );
437+ --color-semi-color-fill-2 : var (--semi-color-fill-2 );
438+
439+ /* Text Colors */
440+ --color-semi-color-text-0 : var (--semi-color-text-0 );
441+ --color-semi-color-text-1 : var (--semi-color-text-1 );
442+ --color-semi-color-text-2 : var (--semi-color-text-2 );
443+ --color-semi-color-text-3 : var (--semi-color-text-3 );
444+
445+ /* Highlight Colors */
446+ --color-semi-color-highlight-bg : var (--semi-color-highlight-bg );
447+ --color-semi-color-highlight : var (--semi-color-highlight );
448+
449+ /* Data Visualization Colors */
450+ --color-semi-color-data-0 : var (--semi-color-data-0 );
451+ --color-semi-color-data-1 : var (--semi-color-data-1 );
452+ --color-semi-color-data-2 : var (--semi-color-data-2 );
453+ --color-semi-color-data-3 : var (--semi-color-data-3 );
454+ --color-semi-color-data-4 : var (--semi-color-data-4 );
455+ --color-semi-color-data-5 : var (--semi-color-data-5 );
456+ --color-semi-color-data-6 : var (--semi-color-data-6 );
457+ --color-semi-color-data-7 : var (--semi-color-data-7 );
458+ --color-semi-color-data-8 : var (--semi-color-data-8 );
459+ --color-semi-color-data-9 : var (--semi-color-data-9 );
460+ --color-semi-color-data-10 : var (--semi-color-data-10 );
461+ --color-semi-color-data-11 : var (--semi-color-data-11 );
462+ --color-semi-color-data-12 : var (--semi-color-data-12 );
463+ --color-semi-color-data-13 : var (--semi-color-data-13 );
464+ --color-semi-color-data-14 : var (--semi-color-data-14 );
465+ --color-semi-color-data-15 : var (--semi-color-data-15 );
466+ --color-semi-color-data-16 : var (--semi-color-data-16 );
467+ --color-semi-color-data-17 : var (--semi-color-data-17 );
468+ --color-semi-color-data-18 : var (--semi-color-data-18 );
469+ --color-semi-color-data-19 : var (--semi-color-data-19 );
470+
471+ /* Border Radius */
472+ --radius-semi-border-radius-extra-small : var (--semi-border-radius-extra-small );
473+ --radius-semi-border-radius-small : var (--semi-border-radius-small );
474+ --radius-semi-border-radius-medium : var (--semi-border-radius-medium );
475+ --radius-semi-border-radius-large : var (--semi-border-radius-large );
476+ --radius-semi-border-radius-circle : var (--semi-border-radius-circle );
477+ --radius-semi-border-radius-full : var (--semi-border-radius-full );
478+ }
479+
480+ ```
138481
482+ After configuration, you can use atomic classes like ` text-semi-color-text-0 ` , ` bg-semi-color-primary ` , ` rounded-semi-border-radius-small ` , etc.
139483
484+ ---
485+
486+ ** Tailwind v3 Configuration:**
487+
488+ Just configure the following content in the Tailwind configuration (i.e. ` tailwind.config.js ` ):
140489
141490``` js
142- module .export = {
491+ module .exports = {
143492 theme: {
144493 colors: {
145494 " semi-color-white" : " var(--semi-color-white)" ,
0 commit comments