Skip to content

Commit ecff9ab

Browse files
sandros94benjamincanac
andauthoredMar 20, 2025··
fix(module): handle tailwindcss import without theme(static) (#3630)
Co-authored-by: Benjamin Canac <canacb1@gmail.com>
1 parent 06bc7d3 commit ecff9ab

File tree

14 files changed

+55
-51
lines changed

14 files changed

+55
-51
lines changed
 

‎README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export default defineNuxtConfig({
5151
2. Import Tailwind CSS and Nuxt UI in your CSS:
5252

5353
```css [assets/css/main.css]
54-
@import "tailwindcss" theme(static);
54+
@import "tailwindcss";
5555
@import "@nuxt/ui";
5656
```
5757

@@ -98,7 +98,7 @@ app.mount('#app')
9898
3. Import Tailwind CSS and Nuxt UI in your CSS:
9999

100100
```css [assets/main.css]
101-
@import "tailwindcss" theme(static);
101+
@import "tailwindcss";
102102
@import "@nuxt/ui";
103103
```
104104

‎docs/app/components/theme-picker/ThemePicker.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ function setBlackAsPrimary(value: boolean) {
8181

8282
<div class="grid grid-cols-3 gap-1 -mx-2">
8383
<ThemePickerButton
84-
chip="primary"
8584
label="Black"
8685
:selected="appConfig.theme.blackAsPrimary"
8786
@click="setBlackAsPrimary(true)"
@@ -90,6 +89,7 @@ function setBlackAsPrimary(value: boolean) {
9089
<span class="inline-block w-2 h-2 rounded-full bg-black dark:bg-white" />
9190
</template>
9291
</ThemePickerButton>
92+
9393
<ThemePickerButton
9494
v-for="color in primaryColors"
9595
:key="color"

‎docs/app/components/theme-picker/ThemePickerButton.vue

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ defineProps<{
55
chip?: string
66
selected?: boolean
77
}>()
8+
9+
const slots = defineSlots<{
10+
leading: () => any
11+
}>()
812
</script>
913

1014
<template>
@@ -17,7 +21,7 @@ defineProps<{
1721
class="capitalize ring-(--ui-border) rounded-[calc(var(--ui-radius))] text-[11px]"
1822
:class="[selected ? 'bg-(--ui-bg-elevated)' : 'hover:bg-(--ui-bg-elevated)/50']"
1923
>
20-
<template v-if="chip" #leading>
24+
<template v-if="chip || !!slots.leading" #leading>
2125
<slot name="leading">
2226
<span
2327
class="inline-block size-2 rounded-full"

‎docs/app/pages/.index.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ design_system:
9797
```
9898
9999
```css [main.css]
100-
@import "tailwindcss" theme(static);
100+
@import "tailwindcss";
101101
@import "@nuxt/ui";
102102
103103
:root {

‎docs/app/plugins/theme.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ export default defineNuxtPlugin({
4141
const primaryColor = localStorage.getItem('nuxt-ui-primary');
4242
if (primaryColor !== 'black') {
4343
html = html.replace(
44-
/(--ui-color-primary-\\d{2,3}:\\s*var\\()--color-${appConfig.ui.colors.primary}-(\\d{2,3}\\))/g,
45-
\`$1--color-\${primaryColor}-$2\`
44+
/(--ui-color-primary-\\d{2,3}:\\s*var\\(--color-)${appConfig.ui.colors.primary}(-\\d{2,3}.*?\\))/g,
45+
\`$1\${primaryColor}$2\`
4646
);
4747
}
4848
}
4949
if (localStorage.getItem('nuxt-ui-neutral')) {
5050
let neutralColor = localStorage.getItem('nuxt-ui-neutral');
5151
html = html.replace(
52-
/(--ui-color-neutral-\\d{2,3}:\\s*var\\()--color-${appConfig.ui.colors.neutral}-(\\d{2,3}\\))/g,
53-
\`$1--color-\${neutralColor === 'neutral' ? 'old-neutral' : neutralColor}-$2\`
52+
/(--ui-color-neutral-\\d{2,3}:\\s*var\\(--color-)${appConfig.ui.colors.neutral}(-\\d{2,3}.*?\\))/g,
53+
\`$1\${neutralColor === 'neutral' ? 'old-neutral' : neutralColor}$2\`
5454
);
5555
}
5656

‎docs/content/1.getting-started/2.installation/1.nuxt.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export default defineNuxtConfig({
5959
::code-group
6060

6161
```css [app/assets/css/main.css]
62-
@import "tailwindcss" theme(static);
62+
@import "tailwindcss";
6363
@import "@nuxt/ui";
6464
```
6565

@@ -72,10 +72,6 @@ export default defineNuxtConfig({
7272

7373
::
7474

75-
::warning
76-
The `theme(static)` is required since [`tailwindcss@4.0.8`](https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.0.8) introduced a breaking change to only expose used CSS variables.
77-
::
78-
7975
::callout{icon="i-simple-icons-visualstudiocode"}
8076
It's recommended to install the [Tailwind CSS IntelliSense](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss) extension for VSCode and add the following settings:
8177

‎docs/content/1.getting-started/2.installation/2.vue.md

+1-5
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,10 @@ app.mount('#app')
102102
#### Import Tailwind CSS and Nuxt UI in your CSS
103103

104104
```css [assets/main.css]
105-
@import "tailwindcss" theme(static);
105+
@import "tailwindcss";
106106
@import "@nuxt/ui";
107107
```
108108

109-
::warning
110-
The `theme(static)` is required since [`tailwindcss@4.0.8`](https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.0.8) introduced a breaking change to only expose used CSS variables.
111-
::
112-
113109
::tip
114110
Import the CSS file in your `main.ts`.
115111

‎docs/content/1.getting-started/2.migration.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ For a detailed walkthrough of all changes, refer to the official **Tailwind CSS
2828
::code-group
2929

3030
```css [app/assets/css/main.css]
31-
@import "tailwindcss" theme(static);
31+
@import "tailwindcss";
3232
```
3333

3434
```ts [nuxt.config.ts]
@@ -109,7 +109,7 @@ bun add @nuxt/ui-pro
109109
:::div
110110

111111
```css [app/assets/css/main.css]{2}
112-
@import "tailwindcss" theme(static);
112+
@import "tailwindcss";
113113
@import "@nuxt/ui";
114114
```
115115

@@ -119,7 +119,7 @@ bun add @nuxt/ui-pro
119119
:::div
120120

121121
```css [app/assets/css/main.css]{2}
122-
@import "tailwindcss" theme(static);
122+
@import "tailwindcss";
123123
@import "@nuxt/ui-pro";
124124
```
125125

‎docs/content/1.getting-started/3.theme.md

+14-14
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Tailwind CSS v4 takes a CSS-first configuration approach, you now customize your
1717
:::div
1818

1919
```css [app/assets/css/main.css]
20-
@import "tailwindcss" theme(static);
20+
@import "tailwindcss";
2121
@import "@nuxt/ui";
2222

2323
@theme static {
@@ -45,7 +45,7 @@ Tailwind CSS v4 takes a CSS-first configuration approach, you now customize your
4545
:::div
4646

4747
```css [app/assets/css/main.css]
48-
@import "tailwindcss" theme(static);
48+
@import "tailwindcss";
4949
@import "@nuxt/ui-pro";
5050

5151
@theme static {
@@ -87,7 +87,7 @@ This can be useful when writing Tailwind CSS classes in markdown files with [`@n
8787
:::div
8888

8989
```css [app/assets/css/main.css]
90-
@import "tailwindcss" theme(static);
90+
@import "tailwindcss";
9191
@import "@nuxt/ui";
9292

9393
@source "../../../content";
@@ -101,7 +101,7 @@ This can be useful when writing Tailwind CSS classes in markdown files with [`@n
101101
:::div
102102

103103
```css [app/assets/css/main.css]
104-
@import "tailwindcss" theme(static);
104+
@import "tailwindcss";
105105
@import "@nuxt/ui-pro";
106106

107107
@source "../../../content";
@@ -380,7 +380,7 @@ You can change which shade is used for each color on light and dark mode:
380380
:::div{class="*:!mb-0 *:!mt-2.5"}
381381

382382
```css [app/assets/css/main.css]
383-
@import "tailwindcss" theme(static);
383+
@import "tailwindcss";
384384
@import "@nuxt/ui";
385385

386386
:root {
@@ -398,7 +398,7 @@ You can change which shade is used for each color on light and dark mode:
398398
:::div{class="*:!mb-0 *:!mt-2.5"}
399399

400400
```css [app/assets/css/main.css]
401-
@import "tailwindcss" theme(static);
401+
@import "tailwindcss";
402402
@import "@nuxt/ui-pro";
403403

404404
:root {
@@ -434,7 +434,7 @@ You cannot set `primary: 'black'`{lang="ts-type"} in your [`vite.config.ts`](#co
434434
:::div{class="*:!mb-0 *:!mt-2.5"}
435435

436436
```css [app/assets/css/main.css]
437-
@import "tailwindcss" theme(static);
437+
@import "tailwindcss";
438438
@import "@nuxt/ui";
439439

440440
:root {
@@ -452,7 +452,7 @@ You cannot set `primary: 'black'`{lang="ts-type"} in your [`vite.config.ts`](#co
452452
:::div{class="*:!mb-0 *:!mt-2.5"}
453453

454454
```css [app/assets/css/main.css]
455-
@import "tailwindcss" theme(static);
455+
@import "tailwindcss";
456456
@import "@nuxt/ui-pro";
457457

458458
:root {
@@ -564,7 +564,7 @@ You can customize these CSS variables to tailor the appearance of your applicati
564564
:::div{class="*:!mb-0 *:!mt-2.5"}
565565

566566
```css [app/assets/css/main.css]
567-
@import "tailwindcss" theme(static);
567+
@import "tailwindcss";
568568
@import "@nuxt/ui";
569569

570570
:root {
@@ -584,7 +584,7 @@ You can customize these CSS variables to tailor the appearance of your applicati
584584
:::div{class="*:!mb-0 *:!mt-2.5"}
585585

586586
```css [app/assets/css/main.css]
587-
@import "tailwindcss" theme(static);
587+
@import "tailwindcss";
588588
@import "@nuxt/ui-pro";
589589

590590
:root {
@@ -625,7 +625,7 @@ You can customize the default radius value using the default Tailwind CSS variab
625625
:::div{class="*:!mb-0 *:!mt-2.5"}
626626

627627
```css [app/assets/css/main.css]
628-
@import "tailwindcss" theme(static);
628+
@import "tailwindcss";
629629
@import "@nuxt/ui";
630630

631631
:root {
@@ -639,7 +639,7 @@ You can customize the default radius value using the default Tailwind CSS variab
639639
:::div{class="*:!mb-0 *:!mt-2.5"}
640640

641641
```css [app/assets/css/main.css]
642-
@import "tailwindcss" theme(static);
642+
@import "tailwindcss";
643643
@import "@nuxt/ui-pro";
644644

645645
:root {
@@ -670,7 +670,7 @@ You can customize the default container width using the default Tailwind CSS var
670670
:::div{class="*:!mb-0 *:!mt-2.5"}
671671

672672
```css [app/assets/css/main.css]
673-
@import "tailwindcss" theme(static);
673+
@import "tailwindcss";
674674
@import "@nuxt/ui";
675675

676676
@theme {
@@ -688,7 +688,7 @@ You can customize the default container width using the default Tailwind CSS var
688688
:::div{class="*:!mb-0 *:!mt-2.5"}
689689

690690
```css [app/assets/css/main.css]
691-
@import "tailwindcss" theme(static);
691+
@import "tailwindcss";
692692
@import "@nuxt/ui-pro";
693693

694694
@theme {

‎docs/content/1.getting-started/5.fonts.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Nuxt UI automatically registers the [`@nuxt/fonts`](https://github.com/nuxt/font
1919
:::div
2020

2121
```css [app/assets/css/main.css]
22-
@import "tailwindcss" theme(static);
22+
@import "tailwindcss";
2323
@import "@nuxt/ui";
2424

2525
@theme {
@@ -33,7 +33,7 @@ Nuxt UI automatically registers the [`@nuxt/fonts`](https://github.com/nuxt/font
3333
:::div
3434

3535
```css [app/assets/css/main.css]
36-
@import "tailwindcss" theme(static);
36+
@import "tailwindcss";
3737
@import "@nuxt/ui-pro";
3838

3939
@theme {

‎playground-vue/src/assets/css/main.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@import "tailwindcss" theme(static) source("../../../..");
1+
@import "tailwindcss" source("../../../..");
22
@import "@nuxt/ui";
33

44
@theme static {

‎playground/app/assets/css/main.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@import "tailwindcss" theme(static) source("../../../..");
1+
@import "tailwindcss" source("../../../..");
22
@import "@nuxt/ui";
33

44
@theme static {

‎src/runtime/plugins/colors.ts

+18-10
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
11
import { computed } from 'vue'
2+
import colors from 'tailwindcss/colors'
3+
import type { UseHeadInput } from '@unhead/vue/types'
24
import { defineNuxtPlugin, useAppConfig, useNuxtApp, useHead } from '#imports'
35
// FIXME: https://github.com/nuxt/module-builder/issues/141#issuecomment-2078248248
46
import type {} from '#app'
5-
import type { UseHeadInput } from '@unhead/vue/types'
7+
8+
const shades = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const
9+
10+
function getColor(color: keyof typeof colors, shade: typeof shades[number]): string {
11+
if (color in colors && typeof colors[color] === 'object' && shade in colors[color]) {
12+
return colors[color][shade] as string
13+
}
14+
return ''
15+
}
16+
17+
function generateShades(key: string, value: string) {
18+
return `${shades.map(shade => `--ui-color-${key}-${shade}: var(--color-${value === 'neutral' ? 'old-neutral' : value}-${shade}, ${getColor(value as keyof typeof colors, shade)});`).join('\n ')}`
19+
}
20+
function generateColor(key: string, shade: number) {
21+
return `--ui-${key}: var(--ui-color-${key}-${shade});`
22+
}
623

724
export default defineNuxtPlugin(() => {
825
const appConfig = useAppConfig()
926
const nuxtApp = useNuxtApp()
1027

11-
const shades = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]
12-
13-
function generateShades(key: string, value: string) {
14-
return `${shades.map(shade => `--ui-color-${key}-${shade}: var(--color-${value === 'neutral' ? 'old-neutral' : value}-${shade});`).join('\n ')}`
15-
}
16-
function generateColor(key: string, shade: number) {
17-
return `--ui-${key}: var(--ui-color-${key}-${shade});`
18-
}
19-
2028
const root = computed(() => {
2129
const { neutral, ...colors } = appConfig.ui.colors
2230

‎src/templates.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export function getTemplates(options: ModuleOptions, uiConfig: Record<string, an
7575
write: true,
7676
getContents: () => `@source "./ui";
7777
78-
@theme default static {
78+
@theme default {
7979
--color-old-neutral-50: ${colors.neutral[50]};
8080
--color-old-neutral-100: ${colors.neutral[100]};
8181
--color-old-neutral-200: ${colors.neutral[200]};

0 commit comments

Comments
 (0)
Please sign in to comment.