Code
Code blocks
Code blocks are rendered by the ProsePre component with syntax highlighting powered by Shiki.
export default defineNuxtConfig({
modules: ['@nuxt/ui']
})
```ts
export default defineNuxtConfig({
modules: ['@nuxt/ui']
})
```
| Prop | Default | Type |
|---|---|---|
icon | any | |
code | string | |
language | string | |
filename | string | |
highlights | number[] | |
hideHeader | boolean | |
meta | string | |
copy | true | boolean | Omit<ButtonProps, LinkPropsKeys> Display a button to copy the code to the clipboard.
|
ui | { root?: SlotClass; header?: SlotClass; filename?: SlotClass; icon?: SlotClass; copy?: SlotClass; base?: SlotClass; } |
export default defineAppConfig({
ui: {
prose: {
pre: {
slots: {
root: 'relative my-5 group',
header: 'flex items-center gap-1.5 border border-muted bg-default border-b-0 relative rounded-t-md px-4 py-3',
filename: 'text-default text-sm/6',
icon: 'size-4 shrink-0',
copy: 'absolute top-[11px] end-[11px] lg:opacity-0 lg:group-hover:opacity-100 lg:focus-visible:opacity-100 transition',
base: 'group font-mono text-sm/6 border border-muted bg-muted rounded-md px-4 py-3 whitespace-pre-wrap wrap-break-word overflow-x-auto outline-primary/25 focus-visible:outline-3 focus-visible:border-primary **:[.line]:block **:[.line.highlight]:-mx-4 **:[.line.highlight]:px-4 **:[.line.highlight]:bg-accented/50!'
},
variants: {
filename: {
true: {
root: '[&>pre]:rounded-t-none [&>pre]:my-0 my-5'
}
}
}
},
codeIcon: {
'.editorconfig': 'i-vscode-icons-file-type-editorconfig',
'.env': 'i-vscode-icons-file-type-dotenv',
'.env.example': 'i-vscode-icons-file-type-dotenv',
'.eslintignore': 'i-vscode-icons-file-type-eslint',
'.eslintrc': 'i-vscode-icons-file-type-eslint',
'.eslintrc.cjs': 'i-vscode-icons-file-type-eslint',
'.gitignore': 'i-vscode-icons-file-type-git',
'.npmrc': 'i-vscode-icons-file-type-npm',
'.nuxtignore': 'i-vscode-icons-file-type-nuxt',
'.nuxtrc': 'i-vscode-icons-file-type-nuxt',
'.vscode/settings.json': 'i-vscode-icons-file-type-vscode',
asm: 'i-vscode-icons-file-type-assembly',
bicep: 'i-vscode-icons-file-type-bicep',
bicepparam: 'i-vscode-icons-file-type-bicep',
bun: 'i-vscode-icons-file-type-bun',
cjs: 'i-vscode-icons-file-type-js',
cs: 'i-vscode-icons-file-type-csharp',
dart: 'i-vscode-icons-file-type-dartlang',
deno: 'i-vscode-icons-file-type-deno',
erl: 'i-vscode-icons-file-type-erlang',
'eslint.config.cjs': 'i-vscode-icons-file-type-eslint',
'eslint.config.js': 'i-vscode-icons-file-type-eslint',
'eslint.config.mjs': 'i-vscode-icons-file-type-eslint',
exs: 'i-vscode-icons-file-type-elixir',
f: 'i-vscode-icons-file-type-fortran',
fs: 'i-vscode-icons-file-type-fsharp',
gleam: 'i-vscode-icons-file-type-gleam',
go: 'i-vscode-icons-file-type-go',
h: 'i-vscode-icons-file-type-cppheader',
hs: 'i-vscode-icons-file-type-haskell',
ico: 'i-vscode-icons-file-type-favicon',
ino: 'i-vscode-icons-file-type-arduino',
jl: 'i-vscode-icons-file-type-julia',
js: 'i-vscode-icons-file-type-js',
jsx: 'i-vscode-icons-file-type-js',
kt: 'i-vscode-icons-file-type-kotlin',
lsp: 'i-vscode-icons-file-type-lisp',
md: 'i-vscode-icons-file-type-markdown',
mjs: 'i-vscode-icons-file-type-js',
npm: 'i-vscode-icons-file-type-npm',
npx: 'i-vscode-icons-file-type-npm',
nuxt: 'i-vscode-icons-file-type-nuxt',
'nuxt.config.js': 'i-vscode-icons-file-type-nuxt',
'nuxt.config.ts': 'i-vscode-icons-file-type-nuxt',
'nuxt.schema.ts': 'i-vscode-icons-file-type-nuxt',
'package.json': 'i-vscode-icons-file-type-node',
pl: 'i-vscode-icons-file-type-perl',
pnpm: 'i-vscode-icons-file-type-pnpm',
ps1: 'i-vscode-icons-file-type-powershell',
psd1: 'i-vscode-icons-file-type-powershell',
psm1: 'i-vscode-icons-file-type-powershell',
py: 'i-vscode-icons-file-type-python',
rb: 'i-vscode-icons-file-type-ruby',
rs: 'i-vscode-icons-file-type-rust',
sbt: 'i-vscode-icons-file-type-scala',
'tailwind.config.js': 'i-vscode-icons-file-type-tailwind',
'tailwind.config.ts': 'i-vscode-icons-file-type-tailwind',
terminal: 'i-lucide-terminal',
ts: 'i-vscode-icons-file-type-typescript',
'tsconfig.json': 'i-vscode-icons-file-type-tsconfig',
tsx: 'i-vscode-icons-file-type-typescript',
vue: 'i-vscode-icons-file-type-vue',
yarn: 'i-vscode-icons-file-type-yarn',
'yarn.lock': 'i-vscode-icons-file-type-yarn',
yml: 'i-vscode-icons-file-type-yaml'
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
prose: {
pre: {
slots: {
root: 'relative my-5 group',
header: 'flex items-center gap-1.5 border border-muted bg-default border-b-0 relative rounded-t-md px-4 py-3',
filename: 'text-default text-sm/6',
icon: 'size-4 shrink-0',
copy: 'absolute top-[11px] end-[11px] lg:opacity-0 lg:group-hover:opacity-100 lg:focus-visible:opacity-100 transition',
base: 'group font-mono text-sm/6 border border-muted bg-muted rounded-md px-4 py-3 whitespace-pre-wrap wrap-break-word overflow-x-auto outline-primary/25 focus-visible:outline-3 focus-visible:border-primary **:[.line]:block **:[.line.highlight]:-mx-4 **:[.line.highlight]:px-4 **:[.line.highlight]:bg-accented/50!'
},
variants: {
filename: {
true: {
root: '[&>pre]:rounded-t-none [&>pre]:my-0 my-5'
}
}
}
},
codeIcon: {
'.editorconfig': 'i-vscode-icons-file-type-editorconfig',
'.env': 'i-vscode-icons-file-type-dotenv',
'.env.example': 'i-vscode-icons-file-type-dotenv',
'.eslintignore': 'i-vscode-icons-file-type-eslint',
'.eslintrc': 'i-vscode-icons-file-type-eslint',
'.eslintrc.cjs': 'i-vscode-icons-file-type-eslint',
'.gitignore': 'i-vscode-icons-file-type-git',
'.npmrc': 'i-vscode-icons-file-type-npm',
'.nuxtignore': 'i-vscode-icons-file-type-nuxt',
'.nuxtrc': 'i-vscode-icons-file-type-nuxt',
'.vscode/settings.json': 'i-vscode-icons-file-type-vscode',
asm: 'i-vscode-icons-file-type-assembly',
bicep: 'i-vscode-icons-file-type-bicep',
bicepparam: 'i-vscode-icons-file-type-bicep',
bun: 'i-vscode-icons-file-type-bun',
cjs: 'i-vscode-icons-file-type-js',
cs: 'i-vscode-icons-file-type-csharp',
dart: 'i-vscode-icons-file-type-dartlang',
deno: 'i-vscode-icons-file-type-deno',
erl: 'i-vscode-icons-file-type-erlang',
'eslint.config.cjs': 'i-vscode-icons-file-type-eslint',
'eslint.config.js': 'i-vscode-icons-file-type-eslint',
'eslint.config.mjs': 'i-vscode-icons-file-type-eslint',
exs: 'i-vscode-icons-file-type-elixir',
f: 'i-vscode-icons-file-type-fortran',
fs: 'i-vscode-icons-file-type-fsharp',
gleam: 'i-vscode-icons-file-type-gleam',
go: 'i-vscode-icons-file-type-go',
h: 'i-vscode-icons-file-type-cppheader',
hs: 'i-vscode-icons-file-type-haskell',
ico: 'i-vscode-icons-file-type-favicon',
ino: 'i-vscode-icons-file-type-arduino',
jl: 'i-vscode-icons-file-type-julia',
js: 'i-vscode-icons-file-type-js',
jsx: 'i-vscode-icons-file-type-js',
kt: 'i-vscode-icons-file-type-kotlin',
lsp: 'i-vscode-icons-file-type-lisp',
md: 'i-vscode-icons-file-type-markdown',
mjs: 'i-vscode-icons-file-type-js',
npm: 'i-vscode-icons-file-type-npm',
npx: 'i-vscode-icons-file-type-npm',
nuxt: 'i-vscode-icons-file-type-nuxt',
'nuxt.config.js': 'i-vscode-icons-file-type-nuxt',
'nuxt.config.ts': 'i-vscode-icons-file-type-nuxt',
'nuxt.schema.ts': 'i-vscode-icons-file-type-nuxt',
'package.json': 'i-vscode-icons-file-type-node',
pl: 'i-vscode-icons-file-type-perl',
pnpm: 'i-vscode-icons-file-type-pnpm',
ps1: 'i-vscode-icons-file-type-powershell',
psd1: 'i-vscode-icons-file-type-powershell',
psm1: 'i-vscode-icons-file-type-powershell',
py: 'i-vscode-icons-file-type-python',
rb: 'i-vscode-icons-file-type-ruby',
rs: 'i-vscode-icons-file-type-rust',
sbt: 'i-vscode-icons-file-type-scala',
'tailwind.config.js': 'i-vscode-icons-file-type-tailwind',
'tailwind.config.ts': 'i-vscode-icons-file-type-tailwind',
terminal: 'i-lucide-terminal',
ts: 'i-vscode-icons-file-type-typescript',
'tsconfig.json': 'i-vscode-icons-file-type-tsconfig',
tsx: 'i-vscode-icons-file-type-typescript',
vue: 'i-vscode-icons-file-type-vue',
yarn: 'i-vscode-icons-file-type-yarn',
'yarn.lock': 'i-vscode-icons-file-type-yarn',
yml: 'i-vscode-icons-file-type-yaml'
}
}
}
})
]
})
Language
Syntax highlighting is available for dozens of programming languages.
<script setup lang="ts">
const message = ref('Hello World!')
function updateMessage() {
message.value = 'Button clicked!'
}
</script>
<template>
<div>
<h1>{{ message }}</h1>
<UButton @click="updateMessage">
Click me
</UButton>
</div>
</template>
```vue
<script setup lang="ts">
const message = ref('Hello World!')
function updateMessage() {
message.value = 'Button clicked!'
}
</script>
<template>
<div>
<h1>{{ message }}</h1>
<UButton @click="updateMessage">
Click me
</UButton>
</div>
</template>
```
material-theme-lighter and material-theme-palenight Shiki themes are used for light and dark mode respectively. When using @nuxt/content, you can change this through the content.build.markdown.highlight key in your nuxt.config.ts. When using standalone @nuxtjs/mdc, configure themes through the mdc.highlight key. When using Comark, configure themes through the shiki plugin options.To support dark mode with Comark, add the following CSS to your stylesheet:html.dark .shiki span {
color: var(--shiki-dark) !important;
background-color: var(--shiki-dark-bg) !important;
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}
Filename
Code blocks support filename display with automatic icon detection.
export default defineNuxtConfig({
modules: ['@nuxt/ui']
})
```ts [nuxt.config.ts]
export default defineNuxtConfig({
modules: ['@nuxt/ui']
})
```
ProseCodeIcon component and contains a set of predefined icons which you can customize in your app configuration:export default defineAppConfig({
ui: {
prose: {
codeIcon: {
terminal: 'i-ph-terminal-window-duotone',
config: 'i-lucide-settings',
package: 'i-lucide-package'
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
prose: {
codeIcon: {
terminal: 'i-ph-terminal-window-duotone',
config: 'i-lucide-settings',
package: 'i-lucide-package'
}
}
}
})
]
})
vscode-icons collection, which is separate from the lucide icons the rest of the components use, and are resolved on demand from the file extension. Install @iconify-json/vscode-icons to serve them locally and offline, just like any other collection.Copy button
Every code-block has a built-in copy button that will copy the code to your clipboard.
Set the copy prop to false to hide the button, or pass Button props to customize it.
ui.icons.copy and ui.icons.copyCheck keys in your app configuration:export default defineAppConfig({
ui: {
icons: {
copy: 'i-lucide-copy',
copyCheck: 'i-lucide-copy-check'
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
icons: {
copy: 'i-lucide-copy',
copyCheck: 'i-lucide-copy-check'
}
}
})
]
})
Line highlighting
Highlight specific lines to draw attention to important parts.
export default defineNuxtConfig({
modules: ['@nuxt/ui'], // This line is highlighted
css: ['~/assets/css/main.css']
})
```ts [nuxt.config.ts] {2}
export default defineNuxtConfig({
modules: ['@nuxt/ui'], // This line is highlighted
css: ['~/assets/css/main.css']
})
```
Code diff
Use the diff language to show changes between code versions.
export default defineNuxtConfig({
modules: [
- '@nuxt/ui-pro'
+ '@nuxt/ui'
]
})
```diff [nuxt.config.ts]
export default defineNuxtConfig({
modules: [
- '@nuxt/ui-pro'
+ '@nuxt/ui'
]
})
```
Inline code
Inline code snippets are rendered by the ProseCode component.
inline code
Color
Use the color prop to change the color of the inline code. Defaults to neutral.
inline code
`inline code`{color="error"}
Lang
Use the lang prop to specify the language of the inline code.
nuxt.config.ts
`nuxt.config.ts`{lang="ts-type"}