nuxt-toc

Table of Contents component for Nuxt Content (v2 and v3)
3,709 11
Install
npm install nuxt-toc
Latest Version:3.0.0
Vue:3
License:MIT
Last Updated:Sep 18, 2026
Links: GitHub  ·  npm
Maintainer: thaikolja

nuxt-toc

npm version npm downloads License CI

Use a Table of Contents for files created with @nuxt/content module. This version is compatible with @nuxt/content v2 and v3.

Full documentation: https://thaikolja.github.io/nuxt-toc/

☀︎ English · 中文 · Deutsch · Español · Français · فارسی

Features

  • Content v2 (queryContent) and v3 (queryCollection)
  • Pass-in :toc (recommended) or optional auto-fetch
  • Nested link depth control
  • Active section highlighting (scroll-spy)
  • Optional smooth scroll + sticky-header offset
  • Stable CSS class/id hooks for theming
  • Accessible list markup

Install

Step 1: Setup

# Adding to existing site
npx nuxi module add nuxt-toc

# Or install manually
npm install nuxt-toc

Step 2: Add module to Nuxt

If you installed nuxt-toc via nuxi module, you can skip this step.

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['nuxt-toc', '@nuxt/content'],
})

Usage

Prefer passing TOC from your page query. Make sure to use the correct version to match your @nuxt/content version.

<script setup lang="ts">
const route = useRoute()
// @nuxt/content v3:
const { data: page } = await useAsyncData(route.path, () =>
  queryCollection('content').path(route.path).first(),
)

// @nuxt/content v2
// queryContent(route.path).findOne()
</script>

<template>
  <ContentRenderer v-if="page" :value="page" />
  <TableOfContents :toc="page?.body?.toc" />
</template>

Or auto-fetch by path:

<TableOfContents path="/docs/intro" />

Props

Prop Type Default Description
toc Toc | null null Prefetched TOC (page.body.toc). Skips fetch when set.
path string '' Auto-fetch path (default: current route).
collection string '' Content v3 collection (default: nuxtToc.collection / content).
depth number 2 Max nesting depth of the link tree (1 = top-level only).
isSublistShown boolean true When false, forces depth 1.
isTitleShownWithNoContent boolean false Keep showing the title when there are no links.
title string 'Table of Contents' Heading text.
scrollSpy boolean true Active-section highlighting.
rootMargin string '0px 0px -80% 0px' IntersectionObserver rootMargin.
smooth boolean false Smooth scroll on link click.
scrollOffset number 0 Scroll offset in px (sticky header).

Module options

Customize nuxt-toc via the following settings (values used here are default values).

export default defineNuxtConfig({
  nuxtToc: {
    collection: 'content',
    depth: 2,
    scrollSpy: true,
    rootMargin: '0px 0px -80% 0px',
    smooth: false,
    scrollOffset: 0,
  },
})

Documentation

To learn more about nuxt-toc and how to use or style it, check out the full documentation. You will find guides, recipes, and more.

Authors

License

This project is licensed under the MIT License.

Related Packages

@barzhsieh/nuxt-content-mermaid

A Nuxt module designed for integrating Mermaid with `@nuxt/content`. It automati...

20,535 16
@nuxt/content

Write your content inside your Nuxt app

4,863,403 3,675
@42flowsdotcom/nuxt-content

Receive 42flows-generated MDC content in your Nuxt Content site

5,497
nuxt-content-tags

Zero-config WordPress-like tagging module for Nuxt Content

623 0

Version History

Version Released Vue License
3.0.0 ^3.0 MIT
2.7.2 ^3.0 MIT
2.7.1 ^3.0 MIT
2.7.0 ^3.0 MIT
2.6.7 ^3.0 MIT