Skip to content

Commit d05fabd

Browse files
committed
chore: add initial tw4 support in v6
1 parent 3f59d4a commit d05fabd

2 files changed

Lines changed: 45 additions & 13 deletions

File tree

src/module.ts

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
updateTemplates,
1111
addTemplate,
1212
isNuxtMajorVersion,
13+
addVitePlugin,
1314
} from '@nuxt/kit'
1415

1516
import { 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

src/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ export type ExperimentalOptions = {
8080
* @default false
8181
*/
8282
strictScanContentPaths: boolean
83+
/**
84+
* Allow usage of Tailwind CSS 4.
85+
*
86+
* @default false
87+
*/
88+
tailwindcss4: boolean
8389
}
8490

8591
export interface ModuleOptions {

0 commit comments

Comments
 (0)