diff --git a/packages/cli/test/utils/__snapshots__/transform-tw-prefix.test.ts.snap b/packages/cli/test/utils/__snapshots__/transform-tw-prefix.test.ts.snap
new file mode 100644
index 00000000..eccb7cc2
--- /dev/null
+++ b/packages/cli/test/utils/__snapshots__/transform-tw-prefix.test.ts.snap
@@ -0,0 +1,127 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`transform tailwind prefix 1`] = `
+"const testVariants = cva(
+ \\"tw-bg-background hover:tw-bg-muted tw-text-primary-foreground sm:focus:tw-text-accent-foreground\\",
+ {
+ variants: {
+ variant: {
+ default:
+ \\"tw-bg-primary tw-text-primary-foreground hover:tw-bg-primary/90\\",
+ },
+ size: {
+ default: \\"tw-h-10 tw-px-4 tw-py-2\\",
+ },
+ },
+ }
+);
+"
+`;
+
+exports[`transform tailwind prefix 2`] = `
+"
+
+ foo
+
+
+ "
+`;
+
+exports[`transform tailwind prefix 3`] = `
+"
+
+ foo
+
+
+ "
+`;
+
+exports[`transform tailwind prefix 4`] = `
+"
+
+ foo
+
+
+ "
+`;
+
+exports[`transform tailwind prefix 5`] = `
+"@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 224 71.4% 4.1%;
+
+ --muted: 220 14.3% 95.9%;
+ --muted-foreground: 220 8.9% 46.1%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 224 71.4% 4.1%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 224 71.4% 4.1%;
+
+ --border: 220 13% 91%;
+ --input: 220 13% 91%;
+
+ --primary: 220.9 39.3% 11%;
+ --primary-foreground: 210 20% 98%;
+
+ --secondary: 220 14.3% 95.9%;
+ --secondary-foreground: 220.9 39.3% 11%;
+
+ --accent: 220 14.3% 95.9%;
+ --accent-foreground: 220.9 39.3% 11%;
+
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 20% 98%;
+
+ --ring: 217.9 10.6% 64.9%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 224 71.4% 4.1%;
+ --foreground: 210 20% 98%;
+
+ --muted: 215 27.9% 16.9%;
+ --muted-foreground: 217.9 10.6% 64.9%;
+
+ --popover: 224 71.4% 4.1%;
+ --popover-foreground: 210 20% 98%;
+
+ --card: 224 71.4% 4.1%;
+ --card-foreground: 210 20% 98%;
+
+ --border: 215 27.9% 16.9%;
+ --input: 215 27.9% 16.9%;
+
+ --primary: 210 20% 98%;
+ --primary-foreground: 220.9 39.3% 11%;
+
+ --secondary: 215 27.9% 16.9%;
+ --secondary-foreground: 210 20% 98%;
+
+ --accent: 215 27.9% 16.9%;
+ --accent-foreground: 210 20% 98%;
+
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 85.7% 97.3%;
+
+ --ring: 215 27.9% 16.9%;
+ }
+}
+
+@layer base {
+ * {
+ @apply tw-border-border;
+ }
+ body {
+ @apply tw-bg-background tw-text-foreground;
+ }
+}"
+`;
diff --git a/packages/cli/test/utils/transform-tw-prefix.test.ts b/packages/cli/test/utils/transform-tw-prefix.test.ts
new file mode 100644
index 00000000..32552714
--- /dev/null
+++ b/packages/cli/test/utils/transform-tw-prefix.test.ts
@@ -0,0 +1,115 @@
+import { expect, it } from 'vitest'
+
+import { transform } from '../../src/utils/transformers'
+import { applyPrefixesCss } from '../../src/utils/transformers/transform-tw-prefix'
+import stone from '../fixtures/colors/stone.json'
+
+it('transform tailwind prefix', async () => {
+ expect(
+ await transform({
+ filename: 'test.ts',
+ raw: `const testVariants = cva(
+ 'bg-background hover:bg-muted text-primary-foreground sm:focus:text-accent-foreground',
+ {
+ variants: {
+ variant: {
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
+ },
+ size: {
+ default: 'h-10 px-4 py-2',
+ },
+ },
+ },
+ )`,
+ config: {
+ tailwind: {
+ baseColor: 'stone',
+ prefix: 'tw-',
+ },
+ aliases: {
+ components: '@/components',
+ utils: '@/lib/utils',
+ },
+ },
+ baseColor: 'stone',
+ }),
+ ).toMatchSnapshot()
+
+ expect(
+ await transform({
+ filename: 'app.vue',
+ raw: `
+
+ foo
+
+
+ `,
+ config: {
+ tailwind: {
+ baseColor: 'stone',
+ prefix: 'tw-',
+ },
+ aliases: {
+ components: '@/components',
+ utils: '@/lib/utils',
+ },
+ },
+ baseColor: 'stone',
+ }),
+ ).toMatchSnapshot()
+
+ expect(
+ await transform({
+ filename: 'app.vue',
+ raw: `
+
+ foo
+
+
+ `,
+ config: {
+ tailwind: {
+ baseColor: 'stone',
+ cssVariables: false,
+ prefix: 'tw-',
+ },
+ aliases: {
+ components: '@/components',
+ utils: '@/lib/utils',
+ },
+ },
+ baseColor: stone,
+ }),
+ ).toMatchSnapshot()
+
+ expect(
+ await transform({
+ filename: 'app.vue',
+ raw: `
+
+ foo
+
+
+ `,
+ config: {
+ tailwind: {
+ baseColor: 'stone',
+ cssVariables: false,
+ prefix: 'tw-',
+ },
+ aliases: {
+ components: '@/components',
+ utils: '@/lib/utils',
+ },
+ },
+ baseColor: stone,
+ }),
+ ).toMatchSnapshot()
+
+ expect(
+ applyPrefixesCss(
+ '@tailwind base;\n@tailwind components;\n@tailwind utilities;\n \n@layer base {\n :root {\n --background: 0 0% 100%;\n --foreground: 224 71.4% 4.1%;\n \n --muted: 220 14.3% 95.9%;\n --muted-foreground: 220 8.9% 46.1%;\n \n --popover: 0 0% 100%;\n --popover-foreground: 224 71.4% 4.1%;\n \n --card: 0 0% 100%;\n --card-foreground: 224 71.4% 4.1%;\n \n --border: 220 13% 91%;\n --input: 220 13% 91%;\n \n --primary: 220.9 39.3% 11%;\n --primary-foreground: 210 20% 98%;\n \n --secondary: 220 14.3% 95.9%;\n --secondary-foreground: 220.9 39.3% 11%;\n \n --accent: 220 14.3% 95.9%;\n --accent-foreground: 220.9 39.3% 11%;\n \n --destructive: 0 84.2% 60.2%;\n --destructive-foreground: 210 20% 98%;\n \n --ring: 217.9 10.6% 64.9%;\n \n --radius: 0.5rem;\n }\n \n .dark {\n --background: 224 71.4% 4.1%;\n --foreground: 210 20% 98%;\n \n --muted: 215 27.9% 16.9%;\n --muted-foreground: 217.9 10.6% 64.9%;\n \n --popover: 224 71.4% 4.1%;\n --popover-foreground: 210 20% 98%;\n \n --card: 224 71.4% 4.1%;\n --card-foreground: 210 20% 98%;\n \n --border: 215 27.9% 16.9%;\n --input: 215 27.9% 16.9%;\n \n --primary: 210 20% 98%;\n --primary-foreground: 220.9 39.3% 11%;\n \n --secondary: 215 27.9% 16.9%;\n --secondary-foreground: 210 20% 98%;\n \n --accent: 215 27.9% 16.9%;\n --accent-foreground: 210 20% 98%;\n \n --destructive: 0 62.8% 30.6%;\n --destructive-foreground: 0 85.7% 97.3%;\n \n --ring: 215 27.9% 16.9%;\n }\n}\n \n@layer base {\n * {\n @apply border-border;\n }\n body {\n @apply bg-background text-foreground;\n }\n}',
+ 'tw-',
+ ),
+ ).toMatchSnapshot()
+})