DaisyUI Color System for Vue Applications: Complete Guide to Theme Configuration

DaisyUI generates theme-aware utility classes using CSS variables defined in variables.css, processed by the themePlugin.js Tailwind plugin, and auto-generates responsive color utilities via generateColorRules.js to work seamlessly with Vue components.

DaisyUI provides a CSS-variable-based color system that integrates natively with Vue applications through Tailwind CSS. The architecture is framework-agnostic, meaning the same color utilities work identically across Vue, React, and Svelte, but Vue developers specifically benefit from the tight integration with Vite and Tailwind's JIT compiler. Understanding how DaisyUI processes themes in packages/daisyui/functions/themePlugin.js and generates utility classes in packages/daisyui/functions/generateColorRules.js allows you to customize palettes effectively while maintaining Tailwind's purging capabilities.

How DaisyUI's Color System Works

The DaisyUI color system operates on three architectural layers: variable declaration, theme injection, and utility generation.

CSS Variable Foundation in variables.css

All DaisyUI themes rely on a standardized set of CSS custom properties defined in packages/daisyui/functions/variables.css. These variables include semantic tokens like --color-primary, --color-base-100, --color-base-content, and state colors like --color-success and --color-error.

When you configure a theme, DaisyUI injects these variables into a :root selector or a custom attribute selector (e.g., [data-theme="custom"]). This approach ensures that switching themes in your Vue application requires only changing a data attribute on a parent element, causing immediate CSS updates without JavaScript re-renders.

Theme Plugin Architecture

The themePlugin.js file implements the core Tailwind plugin logic that processes your configuration. It handles:

  • Theme merging: Combines built-in themes with custom theme objects defined in your Tailwind config
  • Dark mode handling: Automatically generates prefers-color-scheme media queries when prefersdark: true is set
  • Variable injection: Creates the CSS output that defines your color values as CSS variables

According to the DaisyUI source code in packages/daisyui/functions/themePlugin.js, the plugin reads your theme configuration and outputs the appropriate CSS selectors, supporting both single-theme and multi-theme setups.

Utility Class Generation via generateColorRules.js

The generateColorRules.js utility creates three categories of CSS files that map DaisyUI's CSS variables to Tailwind utility classes:

  1. Properties: Static utilities like bg-primary, text-success, border-accent
  2. Responsive: Breakpoint-prefixed utilities like sm:bg-primary, lg:text-success
  3. States: Pseudo-state utilities like hover:bg-primary, focus:border-accent

The generator uses @apply directives to reference CSS variables, ensuring Tailwind can safely purge unused styles while maintaining full compatibility with the framework.

Setting Up DaisyUI in a Vue Project

To use the DaisyUI color system in Vue, you need Tailwind CSS v4 (or v3 with PostCSS) and the DaisyUI plugin.

Installation

npm create vite@latest my-app -- --template vue
cd my-app
npm install -D tailwindcss@latest @tailwindcss/vite@latest daisyui@latest

Vite Configuration

Configure vite.config.js to include the Tailwind plugin:

import { defineConfig } from "vite"
import tailwindcss from "@tailwindcss/vite"
import vue from "@vitejs/plugin-vue"

export default defineConfig({
  plugins: [tailwindcss(), vue()],
})

Importing DaisyUI

In your src/style.css (or main CSS entry), import Tailwind and activate the DaisyUI plugin:

@import "tailwindcss";
@plugin "daisyui";

Now you can use color utilities directly in Vue templates:

<template>
  <div class="bg-base-100 text-base-content p-6 rounded-box">
    <button class="btn btn-primary">Primary Action</button>
    <span class="text-success">Status: Active</span>
  </div>
</template>

Customizing Themes in Vue

DaisyUI allows you to define custom themes by extending the configuration in your Tailwind config file.

Creating a Custom Theme

Define a custom theme object with your desired color values:

// tailwind.config.js
export default {
  content: ["./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}"],
  plugins: [
    require("daisyui"),
  ],
  daisyui: {
    themes: [
      {
        "forest": {
          "primary": "#2c7a7b",
          "primary-content": "#f0fdf4",
          "secondary": "#38b2ac",
          "secondary-content": "#ecfdf5",
          "accent": "#f6e05e",
          "accent-content": "#1a202c",
          "neutral": "#2d3748",
          "base-100": "#1a202c",
          "base-200": "#2d3748",
          "base-300": "#4a5568",
          "info": "#4299e1",
          "success": "#48bb78",
          "warning": "#ed8936",
          "error": "#f56565",
          "prefersdark": true,
        },
      },
    ],
  },
}

With prefersdark: true, DaisyUI automatically generates the appropriate dark-mode media queries. Apply the theme to a specific component or the entire application by adding data-theme="forest" to your HTML element.

Working with Opacity Variants

DaisyUI supports opacity modifiers on all color utilities using the color-mix function in the oklab color space. This feature is automatically generated by generateColorRules.js.

You can append opacity values to any utility:

<div class="bg-primary/20 border-accent/50 text-base-content/80 p-4">
  Semi-transparent content with 20% primary background
</div>

The generated CSS uses color-mix to blend the theme variable with transparency:

.bg-primary\/20 {
  background-color: color-mix(in oklab, var(--color-primary) 20%, transparent);
}

This approach works without requiring Tailwind's opacity variables, keeping the bundle size optimized while supporting any percentage value from 0-100.

Summary

  • DaisyUI stores themes as CSS variables declared in packages/daisyui/functions/variables.css, making them instantly switchable via data attributes
  • The themePlugin.js processor handles theme injection, dark mode configuration, and merging of custom themes with built-in defaults
  • Utility classes are auto-generated by packages/daisyui/functions/generateColorRules.js into properties, responsive, and state-based variants
  • Opacity support uses color-mix in oklab color space, allowing arbitrary transparency values like bg-primary/50
  • Vue integration requires only adding the DaisyUI plugin to your Tailwind configuration and importing the CSS in your Vite project

Frequently Asked Questions

How do I switch themes dynamically in a Vue application?

To switch themes dynamically, modify the data-theme attribute on your <html> or a container element. Since DaisyUI uses CSS variables scoped to the attribute selector, changing document.documentElement.setAttribute('data-theme', 'dark') immediately updates all colors without Vue re-rendering. Store the current theme in a ref or Pinia store, and bind it to the data attribute for reactive theme switching.

Can I use DaisyUI colors with arbitrary Tailwind values?

Yes. DaisyUI generates standard CSS utility classes, so you can combine them with Tailwind's arbitrary value syntax when needed. However, for consistency with the theme system, prefer using the semantic utilities like bg-primary rather than arbitrary values like bg-[#4f46e5], as the semantic classes automatically adapt when you switch themes or customize the palette in tailwind.config.js.

Why are my DaisyUI colors not appearing in Vue components?

Ensure you have imported the DaisyUI plugin in your CSS file using @plugin "daisyui" (Tailwind v4) or added it to the plugins array in tailwind.config.js (v3). Also verify that your content configuration includes your Vue file paths so Tailwind processes the classes. The colors rely on CSS variables injected by the plugin, so missing the plugin registration results in classes without values.

Does DaisyUI support alpha transparency for all color utilities?

Yes. DaisyUI automatically generates opacity variants for all color utilities using the color-mix CSS function. You can use any percentage from 0 to 100, such as text-primary/75 or bg-success/10. These are generated by the generateColorRules.js function and processed in the oklab color space for better perceptual uniformity than simple RGBA mixing.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →