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 — the same shape as DevKey, the reference v0 starter project.
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 vuetify0 (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+
Usage
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.Group v-model="expanded" multiple>
<ExpansionPanel.Root value="item-1">
<ExpansionPanel.Activator>
Section 1
<ExpansionPanel.Cue />
</ExpansionPanel.Activator>
<ExpansionPanel.Content>
Content for section 1
</ExpansionPanel.Content>
</ExpansionPanel.Root>
</ExpansionPanel.Group>
</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
v0 works with Nuxt 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, createForm } from '@vuetify/v0/composables'
// Utilities only
import { isObject, isString } from '@vuetify/v0/utilities'
// Constants only
import { IN_BROWSER } from '@vuetify/v0/constants'Next Steps
Now that v0 is installed, choose your path:
| Goal | Start Here |
|---|---|
| Understand the architecture | Components → Composables → Core |
| Build production UIs now | Theming → Accessibility |
| Build a component library | Building Frameworks |
| Explore interactively | Playground |
Use Cmd+/ on any documentation page to ask AI questions about v0.
Support v0
v0 is built and maintained in the open. If it’s useful to you or your team, sponsoring funds the work and keeps it moving — and need a hand shipping? The Services page covers direct support plans and fixed-scope project builds.
Fund Vuetify0, get your logo on the docs
For companies whose product is built on Vuetify0. Logo across the docs, every page, and the README. One sponsor at a time.