Nuxt Studio offers a versatile workspace for both developers and content writers, giving them the freedom to choose between our different editors:
Markdown filesYAML and JSON filesYou can switch between the visual editor and code editor at any time by clicking the actions dropdown in the toolbar:
Your preference is saved and will be used for all Markdown files.
Markdown files)The TipTap visual editor provides a modern Notion-like editing experience for Markdown content, powered by the popular TipTap editor integrated by Nuxt UI Editor.
/ to access a menu of formatting options and componentsEnable debug mode from the footer menu to see the real-time conversion between:
This is useful for understanding how content is transformed and to share troubleshooting.
The Monaco code editor provides full control over your content, allowing you to write raw content directly:
One of the TipTap visual editor's standout features is its ability to integrate and edit custom Vue components directly within the editor interface.
Developers can create visually complex components, and editors can use them without technical knowledge. The visual editor handles component integration seamlessly.
Vue components need to be located in the /components/content folder to be available in Studio:
<template>
<div class="flex items-start gap-3">
<div class="flex items-center justify-center border rounded-lg p-1.5">
<UIcon :name="icon" />
</div>
<div class="flex flex-col">
<h3 class="font-semibold">
<slot name="title" />
</h3>
<span>
<slot name="description" />
</span>
</div>
</div>
</template>
<script setup lang="ts">
defineProps({
icon: {
type: String,
default: 'i-lucide-cursor-click',
},
})
</script>
Components can be integrated using MDC syntax:
::home-feature
---
icon: i-mdi-vuejs
---
#title
Embedded Vue components
#description
Edit slots and props inside the visual editor.
::
All components in the /components/content folder are automatically available:
/ anywhere while editingBy default, components from external libraries (like Nuxt UI) won't appear in Studio's component list. To make them available, set them as global in your Nuxt config:
export default defineNuxtConfig({
hooks: {
'components:extend': (components) => {
const globals = components.filter(c => ['UButton', 'UIcon'].includes(c.pascalName))
globals.forEach(c => c.global = true)
}
},
})
The form editor will be used for editing:
Markdown filesIt will eliminate the need to interact directly with complex file syntax. Instead, forms will be automatically generated based on your collection schema definition.
zod SchemaOnce the schema property has been defined in your collection, this will automatically generate the corresponding form on Studio interface.
export default defineContentConfig({
collections: {
posts: defineCollection({
type: 'page',
source: 'blog/*.md',
schema: z.object({
draft: z.boolean().default(false),
category: z.enum(['Alps', 'Himalaya', 'Pyrenees']).optional(),
date: z.date(),
image: z.object({
src: property(z.string()).editor({ input: 'media' }),
alt: z.string(),
}),
slug: property(z.string()).editor({ hidden: true }),
icon: property(z.string().optional()).editor({ input: 'icon' }),
authors: z.array(z.object({
slug: z.string(),
username: z.string(),
name: z.string(),
to: z.string(),
avatar: z.object({
src: z.string(),
alt: z.string(),
}),
})),
}),
}),
},
})

Primitive Zod types are automatically mapped to appropriate form inputs in:
Studio goes beyond primitive types. You can customise form fields using the editor method, which extends Zod types with metadata to empower editor interface.
This allows you to define custom inputs or hide fields.
// Icon
icon: property(z.string()).editor({ input: 'icon', iconLibraries: ['lucide', 'simple-icons'] })
// Media
image: property(z.string()).editor({ input: 'media' })
input: 'media' | 'icon'You can set the editor input type. Currently icon and media are available.
iconLibraries: Array<string>Specifies which Iconify libraries to display. Use this option to filter and limit the available icon sets.
hidden: Boolean
This option can be set to avoid the display of a field in the Studio editor.