@@ -10,6 +10,7 @@ import {
1010 updateTemplates ,
1111 addTemplate ,
1212 isNuxtMajorVersion ,
13+ addVitePlugin ,
1314} from '@nuxt/kit'
1415
1516import { name , version , configKey , compatibility } from '../package.json'
@@ -46,6 +47,12 @@ export default defineNuxtModule<ModuleOptions>({
4647 } )
4748 }
4849
50+ const isTailwind4 = await import ( 'tailwindcss/package.json' ) . then ( m => m . default ?? m ) . then ( m => Number . parseFloat ( m . version ) >= 4 )
51+
52+ if ( ! moduleOptions . experimental ?. tailwindcss4 ) {
53+ logger . warn ( 'Tailwind CSS v4 detected. The current version of `@nuxtjs/tailwindcss` supports Tailwind CSS 3 officially and support for v4 is experimental. To suppress this warning, set `tailwindcss.experimental.tailwindcss4` to `true` in your `nuxt.config`.' )
54+ }
55+
4956 const ctx = await createInternalContext ( moduleOptions , nuxt )
5057
5158 if ( moduleOptions . editorSupport ) {
@@ -63,7 +70,12 @@ export default defineNuxtModule<ModuleOptions>({
6370
6471 // css file handling
6572 const [ cssPath , cssPathConfig ] = Array . isArray ( moduleOptions . cssPath ) ? moduleOptions . cssPath : [ moduleOptions . cssPath ]
66- const [ resolvedCss , loggerInfo ] = await resolvers . resolveCSSPath ( cssPath , nuxt )
73+ const [ resolvedCss , loggerInfo ] = await resolvers . resolveCSSPath ( cssPath , nuxt ) . catch ( ( e ) => {
74+ if ( isTailwind4 ) {
75+ return [ addTemplate ( { filename : 'tailwind.css' , getContents : ( ) => `@import 'tailwindcss';` , write : true } ) . dst , 'Generating default CSS file for Tailwind CSS 4...' ]
76+ }
77+ throw e
78+ } )
6779 logger . info ( loggerInfo )
6880
6981 nuxt . options . css = nuxt . options . css ?? [ ]
@@ -93,18 +105,32 @@ export default defineNuxtModule<ModuleOptions>({
93105 nuxt . hook ( 'tailwindcss:internal:regenerateTemplates' , ( ) => updateTemplates ( { filter : template => exposeTemplates . includes ( template . dst ) } ) )
94106 }
95107
96- // setup postcss plugins (for Nuxt 2/bridge/3)
97- const postcssOptions
98- /* nuxt 3 */
99- = nuxt . options . postcss
100- // @ts -expect-error older nuxt3
101- || nuxt . options . build . postcss . postcssOptions
102- // @ts -expect-error nuxt 2 type
103- || nuxt . options . build . postcss as any
104- postcssOptions . plugins = {
105- ...( postcssOptions . plugins || { } ) ,
106- 'tailwindcss/nesting' : postcssOptions . plugins ?. [ 'tailwindcss/nesting' ] ?? { } ,
107- 'tailwindcss' : twConfig . dst satisfies string || _config ,
108+ if ( isTailwind4 && nuxt . options . builder === '@nuxt/vite-builder' ) {
109+ // @ts -expect-error may not be installed
110+ await import ( '@tailwindcss/vite' ) . then ( r => addVitePlugin ( r . default ( ) ) )
111+ }
112+ else {
113+ // setup postcss plugins (for Nuxt 2/bridge/3)
114+ const postcssOptions
115+ /* nuxt 3 */
116+ = nuxt . options . postcss
117+ // @ts -expect-error older nuxt3
118+ || nuxt . options . build . postcss . postcssOptions
119+ // @ts -expect-error nuxt 2 type
120+ || nuxt . options . build . postcss as any
121+
122+ const pluginsToAdd
123+ = isTailwind4
124+ ? { '@tailwindcss/postcss' : { } }
125+ : {
126+ 'tailwindcss/nesting' : postcssOptions . plugins ?. [ 'tailwindcss/nesting' ] ?? { } ,
127+ 'tailwindcss' : twConfig . dst satisfies string || _config ,
128+ }
129+
130+ postcssOptions . plugins = {
131+ ...( postcssOptions . plugins || { } ) ,
132+ ...pluginsToAdd ,
133+ }
108134 }
109135
110136 // enabled only in development
0 commit comments