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 Vuetify0 starter project.
Use the Skill Filter to narrow down navigation to match your experience level:
Manual Setup
To add Vuetify0 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.
Seed Working Examples
Vuetify0 is headless: installing @vuetify/v0 and importing a component gives you logic, accessibility, and state management — but no rendered UI. To start with a working, styled example you can edit and ship, use vuetify add to pull from the docs registry↗︎:
# Interactive picker
pnpm dlx @vuetify/cli add
# Seed a Dialog example
pnpm dlx @vuetify/cli add dialog
# Seed a composable plugin
pnpm dlx @vuetify/cli add use-themenpx @vuetify/cli add
npx @vuetify/cli add dialog
npx @vuetify/cli add use-themeyarn dlx @vuetify/cli add
yarn dlx @vuetify/cli add dialog
yarn dlx @vuetify/cli add use-themebunx @vuetify/cli add
bunx @vuetify/cli add dialog
bunx @vuetify/cli add use-themeThe CLI writes example files into your project, installs any missing dependencies, and records the install in vuetify.json so you can diff or refresh later.
See the Vuetify CLI guide for the full command list, registry options, and vuetify.json tracking.
Requirements
Vue 3.5.0 or higher
Node 22+ recommended for app tooling. Developing Vuetify0 itself requires Node 26+ (see Contributing).
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
Vuetify0 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
Vuetify0 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). |
@vuetify/v0/locale/messages/en | Optional canonical English aria-string map for component accessible names. Never imported by the runtime. |
// 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'Agents
Click the portrait to copy John’s identity into Grok Bot↗︎. Setup prompts live on Agents.
Next Steps
Now that Vuetify0 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 |
| Seed styled examples | Vuetify CLI (vuetify add) |
| Set up an AI agent | Agents → AI Tools |
| Explore interactively | Playground |
Use Cmd+/ on any documentation page to ask AI questions about Vuetify0.
Support Vuetify0
Vuetify0 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.