Nuxt module for UnoCSS that integrates the instant on-demand Atomic CSS engine into Nuxt.js applications
npx @tessl/cli install tessl/npm-unocss--nuxt@66.5.0@unocss/nuxt is a Nuxt module that integrates UnoCSS, the instant on-demand Atomic CSS engine, into Nuxt.js applications. It provides seamless integration with both Vite and Webpack build systems, enabling developers to use UnoCSS's powerful utility-first CSS framework within Nuxt projects with zero runtime overhead and instant compilation.
npm install @unocss/nuxtimport UnoCSS from "@unocss/nuxt";For accessing configuration types:
import type { UnocssNuxtOptions } from "@unocss/nuxt";For TypeScript projects, both the module and types are available:
import UnoCSS, { type UnocssNuxtOptions } from "@unocss/nuxt";Add the module to your nuxt.config.ts:
export default defineNuxtConfig({
modules: [
'@unocss/nuxt'
],
unocss: {
// UnoCSS options
preflight: true,
icons: true,
}
});@unocss/nuxt is built around several key components:
<UnoIcon> for enhanced functionalityCore Nuxt module that registers UnoCSS integration with comprehensive configuration options.
/**
* Default export - Nuxt module for UnoCSS integration
*/
declare const UnoCSS: NuxtModule<UnocssNuxtOptions>;
export default UnoCSS;
/**
* Configuration options interface
*/
export interface UnocssNuxtOptions extends UserConfig {
/** CSS Generation mode (Vite only, default: 'global') */
mode?: 'global' | 'per-module' | 'vue-scoped' | 'dist-chunk' | 'shadow-dom';
/** Automatically inject uno.css entry (default: true) */
autoImport?: boolean;
/** Inject @unocss/reset/tailwind.css entry (default: false) */
preflight?: boolean;
/** Disable Nuxt's inline styles for UnoCSS compatibility (default: true) */
disableNuxtInlineStyle?: boolean;
/** Automatically merge UnoCSS configs from Nuxt layers (default: false) */
nuxtLayers?: boolean;
/** Path to UnoCSS config file (default: ['uno.config', 'unocss.config']) */
configFile?: string | string[];
/** @deprecated Position control for uno.css injection - temporarily removed due to incompatibility with Nuxt 3.9 */
injectPosition?: 'first' | 'last' | number | { after?: string };
/** Install UnoCSS components like <UnoIcon> (default: true) */
components?: boolean;
/** Enable attributify mode and options (default: false) */
attributify?: boolean | AttributifyOptions;
/** Enable tagify mode and options (default: false) */
tagify?: boolean | TagifyOptions;
/** Enable icons preset and options (default: false) */
icons?: boolean | IconsOptions;
/** Enable web fonts preset and options (default: false) */
webFonts?: boolean | WebFontsOptions;
/** Enable typography preset and options (default: false) */
typography?: boolean | TypographyOptions;
/** Enable wind3 preset (default: true) */
wind3?: boolean | PresetWind3Options;
/** Enable wind4 preset (default: false) */
wind4?: boolean | PresetWind4Options;
}Extends Nuxt's configuration schema to include UnoCSS options and provides integration hooks.
/**
* Nuxt configuration schema extensions and hooks
*/
declare module '@nuxt/schema' {
interface NuxtConfig {
unocss?: UnocssNuxtOptions;
}
interface NuxtOptions {
unocss?: UnocssNuxtOptions;
}
interface NuxtHooks {
/**
* Hook called when UnoCSS config loading is completed
*/
'unocss:config': (config: UserConfig) => void;
}
}Vue components provided by the module for enhanced UnoCSS integration.
/**
* UnoIcon Vue component - basic empty div element
* Available when components option is enabled (default: true)
* Note: This is a placeholder component with no props or functionality
*/
declare const UnoIcon: DefineComponent;interface UnocssNuxtOptions extends UserConfig {
mode?: 'global' | 'per-module' | 'vue-scoped' | 'dist-chunk' | 'shadow-dom';
autoImport?: boolean;
preflight?: boolean;
disableNuxtInlineStyle?: boolean;
nuxtLayers?: boolean;
configFile?: string | string[];
injectPosition?: 'first' | 'last' | number | { after?: string };
components?: boolean;
attributify?: boolean | AttributifyOptions;
tagify?: boolean | TagifyOptions;
icons?: boolean | IconsOptions;
webFonts?: boolean | WebFontsOptions;
typography?: boolean | TypographyOptions;
wind3?: boolean | PresetWind3Options;
wind4?: boolean | PresetWind4Options;
}/**
* Preset configuration types (imported from respective preset packages)
*/
type AttributifyOptions = import('@unocss/preset-attributify').AttributifyOptions;
type IconsOptions = import('@unocss/preset-icons').IconsOptions;
type TagifyOptions = import('@unocss/preset-tagify').TagifyOptions;
type TypographyOptions = import('@unocss/preset-typography').TypographyOptions;
type WebFontsOptions = import('@unocss/preset-web-fonts').WebFontsOptions;
type PresetWind3Options = import('@unocss/preset-wind3').PresetWind3Options;
type PresetWind4Options = import('@unocss/preset-wind4').PresetWind4Options;/**
* Base UnoCSS configuration (from @unocss/core)
*/
type UserConfig = import('@unocss/core').UserConfig;// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@unocss/nuxt'],
unocss: {
// Enable preflight (CSS reset)
preflight: true,
// Enable UnoCSS icons
icons: true,
// Enable attributify mode
attributify: true,
// Use global CSS injection mode
mode: 'global'
}
});// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@unocss/nuxt'],
unocss: {
preflight: true,
icons: {
scale: 1.2,
warn: true,
collections: {
carbon: () => import('@iconify-json/carbon/icons.json').then(i => i.default),
}
},
webFonts: {
provider: 'google',
fonts: {
sans: 'Roboto',
mono: ['Fira Code', 'Fira Mono:400,700']
}
},
shortcuts: {
'btn': 'px-4 py-1 rounded inline-block bg-teal-600 text-white cursor-pointer hover:bg-teal-700 disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50',
'btn-green': 'text-white bg-green-500 hover:bg-green-700',
},
rules: [
[/^m-(\d+)$/, ([, d]) => ({ margin: `${d}px` })],
]
}
});// nuxt.config.ts
export default defineNuxtConfig({
modules: ['@unocss/nuxt'],
unocss: {
// Enable automatic config merging from layers
nuxtLayers: true,
// Specify custom config file paths
configFile: ['uno.config.ts', 'unocss.config.ts'],
// Base configuration
preflight: true,
wind3: true
}
});// nuxt.config.ts
import type { UnocssNuxtOptions } from '@unocss/nuxt';
const unocssConfig: UnocssNuxtOptions = {
preflight: true,
icons: true,
attributify: true,
wind3: true,
shortcuts: {
'custom-btn': 'bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600'
}
};
export default defineNuxtConfig({
modules: ['@unocss/nuxt'],
unocss: unocssConfig
});<template>
<div>
<!-- UnoIcon component automatically available when components: true -->
<!-- Note: UnoIcon is currently a placeholder empty div component -->
<UnoIcon />
</div>
</template>// plugins/unocss.client.ts
export default defineNuxtPlugin(() => {
// Hook into UnoCSS configuration
const nuxtApp = useNuxtApp();
nuxtApp.hook('unocss:config', (config) => {
console.log('UnoCSS configuration loaded:', config);
});
});In development mode, the module automatically registers a UnoCSS panel in Nuxt DevTools, accessible at /__unocss/ for inspecting generated CSS and configuration.