Tailwind 4 把配置搬进了 CSS。daisyUI 5 跟着这个模型走,主题也是 CSS 里的插件选项。

接入方式

import tailwindcss from '@tailwindcss/vite'

export default defineNuxtConfig({
  css: ['~/assets/css/main.css'],
  vite: {
    plugins: [tailwindcss()],
  },
})

定义两套主题

@import 'tailwindcss';

@plugin 'daisyui' {
  themes: false;
}

@plugin 'daisyui/theme' {
  name: 'myblog';
  default: true;
  color-scheme: light;
  --color-primary: oklch(44% 0.088 250);
}

@plugin 'daisyui/theme' {
  name: 'myblog-dark';
  color-scheme: dark;
  --color-primary: oklch(78% 0.084 235);
}

themes: false 表示不加载 daisyUI 自带的几十套主题,只留我们自己定义的两套。

切换与防闪烁

切换就是把 data-theme 写到 <html> 上;防闪烁的关键是这个属性必须在首屏绘制前就位,所以要在 <head> 里内联一小段脚本,而不是等 Vue 挂载。

var stored = localStorage.getItem('myblog-theme')
var theme =
  stored || (matchMedia('(prefers-color-scheme: dark)').matches ? 'myblog-dark' : 'myblog')
document.documentElement.setAttribute('data-theme', theme)

顺带一提

深色模式下代码块的配色由 Shiki 的双主题负责:浅色写内联样式,深色用 --shiki-dark 变量,再用一条属性选择器覆盖即可。