Get started with Vuetify0
Vuetify0 provides headless UI primitives and composables for Vue 3. Components are unstyled and logic-focused, giving you complete control over styling while handling accessibility, keyboard navigation, and state management.
Quick Start
The fastest way to start a new Vuetify0 project is with the CLI.
Vuetify Create
Standalone scaffolding tool for Vuetify0 projects using Vuetify Create↗.
pnpm create vuetify0npm create vuetify0yarn create vuetify0bun create vuetify0Vuetify CLI
Full-featured CLI with additional presets and options using Vuetify CLI.
pnpm dlx @vuetify/cli init --type vuetify0npx @vuetify/cli init --type vuetify0yarn dlx @vuetify/cli init --type vuetify0bunx @vuetify/cli init --type vuetify0Both options scaffold a complete project with UnoCSS, theming, and example components pre-configured.
Use the Skill Filter to narrow down navigation to match your experience level:
Manual Setup
To add v0 to an existing project, follow the steps below.
Create Vue Project
pnpm create vue@latestnpm create vue@latestyarn create vuebun create vue@latestInstallation
Install @vuetify/v0 with your preferred package manager:
pnpm add @vuetify/v0npm install @vuetify/v0yarn add @vuetify/v0bun add @vuetify/v0Create a plugin file to configure v0:
import { createThemePlugin } from '@vuetify/v0'
import type { App } from 'vue'
export default function zero (app: App) {
app.use(
createThemePlugin({
default: 'light',
themes: {
light: {
dark: false,
colors: {
primary: '#3b82f6',
surface: '#ffffff',
'on-primary': '#ffffff',
'on-surface': '#212121',
},
},
},
}),
)
}Register the plugin in your app entry:
import { createApp } from 'vue'
import App from './App.vue'
import vuetify0 from './plugins/vuetify0'
const app = createApp(App)
vuetify0(app)
app.mount('#app')For additional plugins, theming options, and advanced configuration, see the Guide.
Requirements
Vue 3.5.0 or higher
Node 22+
Quick Start
Import and use components directly - no plugin installation required:
<script setup lang="ts">
import { ExpansionPanel } from '@vuetify/v0'
import { shallowRef } from 'vue'
const expanded = shallowRef([])
</script>
<template>
<ExpansionPanel.Root v-model="expanded" multiple>
<ExpansionPanel.Item value="item-1">
<ExpansionPanel.Activator>
Section 1
</ExpansionPanel.Activator>
<ExpansionPanel.Content>
Content for section 1
</ExpansionPanel.Content>
</ExpansionPanel.Item>
</ExpansionPanel.Root>
</template>Components are completely unstyled. Add your own classes using Tailwind, UnoCSS, or plain CSS.
Styling
v0 is style-agnostic. Choose your preferred CSS framework and map theme colors to v0’s CSS variables.
UnoCSS
UnoCSS↗ is our recommended choice for its speed and flexibility.
1. Install
pnpm add -D unocss @unocss/preset-windnpm install -D unocss @unocss/preset-windyarn add -D unocss @unocss/preset-windbun add -D unocss @unocss/preset-wind2. Configure
import { defineConfig, presetWind } from 'unocss'
export default defineConfig({
presets: [presetWind()],
theme: {
colors: {
primary: 'var(--v0-primary)',
surface: 'var(--v0-surface)',
'on-primary': 'var(--v0-on-primary)',
'on-surface': 'var(--v0-on-surface)',
// Add more theme colors as needed
},
},
})3. Add Vite Plugin
import UnoCSS from 'unocss/vite'
export default defineConfig({
plugins: [
vue(),
UnoCSS(),
],
})4. Import Styles
import 'virtual:uno.css'Now use utility classes in your components:
<template>
<button class="bg-primary text-on-primary px-4 py-2 rounded">
Click me
</button>
</template>Tailwind CSS v4
Tailwind v4↗ uses CSS-first configuration with native cascade layers.
1. Install
pnpm add -D tailwindcss @tailwindcss/vitenpm install -D tailwindcss @tailwindcss/viteyarn add -D tailwindcss @tailwindcss/vitebun add -D tailwindcss @tailwindcss/vite2. Add Vite Plugin
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
vue(),
tailwindcss(),
],
})3. Create Stylesheet
@import "tailwindcss";
@theme {
--color-primary: var(--v0-primary);
--color-surface: var(--v0-surface);
--color-on-primary: var(--v0-on-primary);
--color-on-surface: var(--v0-on-surface);
}4. Import Styles
import './styles/main.css'Now use utility classes in your components:
<template>
<button class="bg-primary text-on-primary px-4 py-2 rounded">
Click me
</button>
</template>CSS Modules
Vue’s built-in CSS Modules↗ require zero configuration.
<template>
<button :class="$style.btn">
Click me
</button>
</template>
<style module>
.btn {
background: var(--v0-primary);
color: var(--v0-on-primary);
padding: 0.5rem 1rem;
border-radius: 0.25rem;
}
</style>Type-safe access via useCssModule():
<script setup lang="ts">
import { useCssModule } from 'vue'
const $style = useCssModule()
</script>
<template>
<button :class="$style.btn">Click me</button>
</template>For dark mode, custom themes, and design tokens, see the Theming Guide.
Nuxt 3
v0 works with Nuxt 3 via a standard plugin.
1. Create Plugin
import { createThemePlugin } from '@vuetify/v0'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(
createThemePlugin({
default: 'light',
themes: {
light: {
dark: false,
colors: {
primary: '#3b82f6',
surface: '#ffffff',
'on-primary': '#ffffff',
'on-surface': '#212121',
},
},
dark: {
dark: true,
colors: {
primary: '#60a5fa',
surface: '#1e1e1e',
'on-primary': '#1a1a1a',
'on-surface': '#e0e0e0',
},
},
},
}),
)
})2. Configure Nuxt
export default defineNuxtConfig({
build: {
transpile: ['@vuetify/v0'],
},
})For auto-imports, SSR hydration, and theme persistence, see the Nuxt Guide.
Exposed Exports
The following export paths exist for the Vuetify0 framework:
| Name | Description |
|---|---|
@vuetify/v0 | Main entry point exposing all components, composables, and utilities. |
@vuetify/v0/components | Components only. |
@vuetify/v0/composables | Composables only. |
@vuetify/v0/utilities | Utilities only. |
@vuetify/v0/constants | Constants only (not included in main entry). |
// Everything
import { ExpansionPanel, createSelection } from '@vuetify/v0'
// Components only
import { ExpansionPanel, Single, Group } from '@vuetify/v0/components'
// Composables only
import { createSelection, useTheme, useForm } from '@vuetify/v0/composables'
// Utilities only
import { isObject, isString } from '@vuetify/v0/utilities'
// Constants only
import { IN_BROWSER } from '@vuetify/v0/constants'