Skip to content

hanyujie2002/nuxt-toc

Repository files navigation

中文

nuxt-toc

npm version npm downloads License Nuxt

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.

Quick Start 🔧

  1. Install the module to your Nuxt application with one command:
npx nuxi module add nuxt-toc
  1. Add <TableOfContents /> at where TOC is needed.
<template>
    <ContentDoc />
    <TableOfContents />
</template>

Props

Prop Type Default Description
path String '' The path to the content for which the TOC is generated. If not set, nuxt-toc will default to using the current URI as the path.
isSublistShown Boolean true Determines whether the sublist within the TOC is shown.
isTitleShownWithNoContent Boolean false Determines whether the title is shown even if there is no content in the TOC.
title String 'Table of Contents' The title of the TOC.

Styling

ID/Class Type Description
toc-container ID The container for the table of contents (TOC).
toc-title ID The title of the table of contents.
toc-item Class General class for TOC items.
toc-topitem Class Specific class for top-level TOC items.
active-toc-item Class Applied to active TOC items.
active-toc-topitem Class Applied to active top-level TOC items.
toc-link Class General class for TOC links.
toc-toplink Class Specific class for top-level TOC links.
active-toc-link Class Applied to active TOC links.
active-toc-toplink Class Applied to active top-level TOC links.
toc-sublist Class Styles the sublist within the TOC.
toc-subitem Class Specific class for sub-level TOC items.
active-toc-subitem Class Applied to active sub-level TOC items.
toc-sublink Class Specific class for sub-level TOC links.
active-toc-sublink Class Applied to active sub-level TOC links.
toc-item-${link.id} ID Dynamically generated ID for each TOC item, based on the link.id.
toc-topitem-and-sublist Class Styles 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;
}

You can customize the style or reset it with:

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

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

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 bg-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;
  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>
.active-toc-item {
  /* Overrides builtin style */
  color: inherit;
}

/* 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 {
  @apply text-inherit
}

.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.