Nuxt Nation conference is coming. Join us on November 12-13.

nuxt-toc
nuxt-toc

Nuxt module for table of contents (TOC) component in Nuxt Content projects

中文

nuxt-toc

npm versionnpm downloadsLicenseNuxt

logo

A Nuxt module for table of contents (TOC) component in your Nuxt Content projects.

Features ✨

  • 🎨 Highly Customizable: Tailor it to fit your unique needs.
  • 🔍 Active TOC Highlighting: Easily see which section you're in.
  • 📦 Out of the Box: Ready to use with minimal setup.
  • 🔗 Section Links: Navigate seamlessly within your content.
  • ARIA Support: Ensures accessibility for all users.
  • 🆓 Free and Open Source (MIT License): Enjoy the freedom to use, modify, and distribute.

Quick Start 🔧

  1. Install the module to your Nuxt application:
npx nuxi module add nuxt-toc
  1. Add <TableOfContents /> at where you need the TOC.
<template>
    <ContentDoc />
    <TableOfContents />
</template>

You can also pass in TOC yourself to prevent duplicate fetching.

<template>
    <ContentRenderer :value="data" />
    <TableOfContents :toc="data.body.toc" />
</template>

<script setup>
const route = useRoute()

const { data } = await useAsyncData('home', () => queryContent(route.path).findOne())
</script>

Props

PropTypeDefaultDescription
tocJSONnullUse the provided toc data. If toc is passed in, this component will not fetch TOC info itself and path prop will be ignored.
pathString''The path to the content for which the TOC is generated. Defaults to using the current URI if not set.
isSublistShownBooleantrueDetermines whether the sublist within the TOC is shown.
isTitleShownWithNoContentBooleanfalseDetermines whether the title is shown even if there is no content in the TOC.
titleString'Table of Contents'The title of the TOC.

Styling

ID/ClassTypeDescription
toc-containerIDThe container for the table of contents (TOC).
toc-titleIDThe title of the table of contents.
toc-itemClassGeneral class for TOC items.
toc-topitemClassSpecific class for top-level TOC items.
active-toc-itemClassApplied to active TOC items.
active-toc-topitemClassApplied to active top-level TOC items.
toc-linkClassGeneral class for TOC links.
toc-toplinkClassSpecific class for top-level TOC links.
toc-sublistClassStyles the sublist within the TOC.
toc-subitemClassSpecific class for sub-level TOC items.
active-toc-subitemClassApplied to active sub-level TOC items.
toc-sublinkClassSpecific class for sub-level TOC links.
toc-item-${link.id}IDDynamically generated ID for each TOC item, based on the link.id.
toc-topitem-and-sublistClassStyles the top-level TOC items and their sublists.

!NOTE The default styling of the <TableOfContents /> component is:

.active-toc-item {
  color: #fef08a;
}

.toc-sublist-item {
  padding-left: 1rem;
}

a {
  text-decoration: none;
  color: inherit;
}

ul,
ol {
  list-style: none;
  padding: 0;
  margin: 0;
}

You can customize the style or reset it with:

.active-toc-item {
  color: initial;
}

.toc-sublist-item {
  padding-left: initial;
}

a {
  text-decoration: underline;
  color: initial;
}

ul,
ol {
  list-style: initial;
  padding: initial;
  margin: initial;
}

Cookbook

Example One

Custom color for active items and custom padding for subitems

<template>
    <ContentDoc />
    <TableOfContents />
</template>

<style>
/* Styling for active Table of Contents items */
.active-toc-item {
  color: #4ade80;
}

/* Indentation for second-level Table of Contents items */
.toc-sublist-item {
  padding-left: 1.5rem;
}
</style>

<!-- Or with Tailwind CSS
<style>
.active-toc-item {
  @apply text-green-300
}

.toc-sublist-item {
  @apply pl-1.5
}
</style>
-->

Result:

example

Example Two

Having a bar at left of each item

<template>
    <ContentDoc />
    <TableOfContents />
</template>

<style>
.toc-item {
  border-left-width: 2px;
  border-left-style: solid;
  border-color: #e5e7eb;
  padding-left: 0.25rem /* 4px */;
}

.active-toc-item {
  color: #60a5fa;
  border-color: #60a5fa;
}

.toc-sublist-item {
  padding-left: 1rem;
}
</style>

<!-- Or with Tailwind CSS
<style>
.toc-item {
  @apply border-l-2 pl-1
}

.active-toc-item {
  @apply text-blue-400 border-blue-400
}

.toc-sublist-item {
  @apply pl-4
}
</style>
-->

Result:

example1

Example Three

First level titles be active when any of it's second level titles be active.

<template>
    <ContentDoc />
    <TableOfContents />
</template>

<style>
/* Sublist item is contained in sub list, which is top item's sibling */
.active-toc-item, .toc-topitem:has(+ .toc-sublist .active-toc-sublist-item) {
  color: #60a5fa
}

.active-toc-sublist-item {
  color: #4ade80
}

.toc-sublist-item {
  padding-left: 1rem /* 16px */;
}
</style>

<!-- Or with Tailwind CSS
<style>
.active-toc-item, .toc-topitem:has(+ .toc-sublist .active-toc-sublist-item) {
  @apply text-blue-400
}

.active-toc-sublist-item {
  @apply text-green-400
}

.toc-sublist-item {
  @apply pl-4
}
</style>
-->

Result:

example2

License

This project is under MIT license.