PHPackages                             goldnead/statamic-toc - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. goldnead/statamic-toc

ActiveStatamic-addon[Parsing &amp; Serialization](/categories/parsing)

goldnead/statamic-toc
=====================

Automatic Table Of Contents Generator for Statamic Bard-Fields.

v2.0.0(2w ago)213.2k↓41.3%8[3 issues](https://github.com/goldnead/statamic-toc/issues)[4 PRs](https://github.com/goldnead/statamic-toc/pulls)proprietaryPHPPHP ^8.2CI passing

Since Jul 6Pushed 4mo ago1 watchersCompare

[ Source](https://github.com/goldnead/statamic-toc)[ Packagist](https://packagist.org/packages/goldnead/statamic-toc)[ RSS](/packages/goldnead-statamic-toc/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (10)Dependencies (10)Versions (41)Used By (0)

[![Latest Version](https://camo.githubusercontent.com/c7707f5c795609b16ac9382846436758c097bc79e8e67fc92af1934bbcd18e37/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f676f6c646e6561642f73746174616d69632d746f633f7374796c653d666c61742d737175617265)](https://github.com/goldnead/statamic-toc/releases)[![Statamic v5+](https://camo.githubusercontent.com/558cd061844c550ff473942167ef98a342f9beb127655e77b53ec5bb13d19c4e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53746174616d69632d35253230253743253230362d464632363945)](https://camo.githubusercontent.com/558cd061844c550ff473942167ef98a342f9beb127655e77b53ec5bb13d19c4e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53746174616d69632d35253230253743253230362d464632363945)[![PHP 8.2+](https://camo.githubusercontent.com/d8cb12d4161bcf3d0abb89bdcd751b5c5812aff012d9323cd8cc56633e950041/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322b2d373737424234)](https://camo.githubusercontent.com/d8cb12d4161bcf3d0abb89bdcd751b5c5812aff012d9323cd8cc56633e950041/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322b2d373737424234)[![workflow](https://github.com/goldnead/statamic-toc/actions/workflows/tests.yaml/badge.svg)](https://github.com/goldnead/statamic-toc/actions/workflows/tests.yaml/badge.svg)

Statamic ToC
============

[](#statamic-toc)

Automatic Table Of Contents for Statamic Bard or Markdown fields or other HTML content

This addon generates a Table-Of-Contents (ToC) for any Bard- or Markdown-Field in Statamic. Just like any Antlers-Tag you can use this addon in your templates with the usual Statamic-Magic Sugar:

```

  Table Of Contents

      {{ toc depth="3" }}

        {{ toc_title }}
        {{ if children }}

          {{ *recursive children* }}

        {{ /if }}

      {{ /toc }}

```

Sweet, isn't it?

Installation
------------

[](#installation)

Install via composer:

```
composer require goldnead/statamic-toc
```

No further Vendor-Publishing or config files are needed.

Requires PHP 8.2 and Statamic 5 or 6. Statamic 3 and 4 are no longer supported: the v1 line ends at `v1.10`, which stays installable but receives no further fixes. Upgrading from v1? See [UPGRADE.md](UPGRADE.md).

Usage
-----

[](#usage)

This Addon provides the functionality to automatically generate an array of headings from your bard or markdown field you can iterate over in your antlers templates. Additionally, it ships with a modifier to automatically generate IDs for anchor-links.

### Blueprint setup

[](#blueprint-setup)

Ideally, this addon works out-of-the-box with any bard setup. Behind the scenes it parses the given content for headlines and generates an associative nested (or unnested, see options below) array that you can iterate through. So, no special headline-sets are needed, just the plain ol' default Bard-field can be used:

```
title: test
sections:
  main:
    display: Main
    fields:
      ...
      -
        handle: bard
        field:
          always_show_set_button: false
          buttons:
            - h2
            - h3
            - bold
            - italic
            - unorderedlist
            - orderedlist
            - removeformat
            - quote
            - anchor
            - image
            - table
          toolbar_mode: fixed
          link_noopener: false
          link_noreferrer: false
          target_blank: false
          reading_time: false
          fullscreen: true
          allow_source: true
          enable_input_rules: true
          enable_paste_rules: true
          display: Bard
          type: bard
          icon: bard
          listable: hidden
```

Of course, you can use as many heading-buttons as you like. If you prefer to save your bard-content as HTML, you can safely turn on `save_html: true` in your bard-settings. You can also use this addon with your markdown-fields. Just pass it along to the tag like this:

```
{{ toc content="{markdown}" }}
  ...
{{ /toc }}

```

or

```
{{ toc field="{markdown_fieldname}" }}
  ...
{{ /toc }}

```

### The `toc` Modifier

[](#the-toc-modifier)

Use the modifier in your templates to add IDs to your headings:

```
{{ text | toc }}

```

Then you get something like this:

```
This is an example heading

  Voluptate do ad anim do mollit proident incididunt culpa ex quis aliquip et
  irure Lorem. Voluptate enim cillum do nostrud eiusmod deserunt.

```

!&gt; Note: When headings are duplicated, the ID is suffixed with a number preventing duplicated IDs which would be semantially wrong in HTML.

If a heading already has an ID, from Bard's anchor button or from hand-written HTML, that ID is kept and the table of contents links to it. The modifier never adds a second one.

The tag and the modifier take their IDs from the same place, so the list and the headings always agree, whatever `from`, `depth` or `exclude` are set to.

### The `toc` Tag

[](#the-toc-tag)

You can use the `toc`-Tag like you would use any recursive tag (like the `nav` Tag) in your Antler-Templates:

```

  {{ toc }}

    {{ toc_title }}

    {{ if children }}

      {{ *recursive children* }}

    {{ /if }}

  {{ /toc }}

```

By default, this addon assumes your bard-content lives inside a content-field named `article`. To change that behaviour you can assign the name of the bard field with the parameter `field`:

`{{ toc field="bard" }}`

or alternatively you can pass the bard-content directly to the `content` parameter:

`{{ toc :content="bard" }} or {{ toc content="{bard}" }}`

If you don't want to display your ToC as a nested list you can pass the parameter `is_flat` which flattens your list to one level:

```

  {{ toc is_flat="true" }}

    {{ toc_title }}

  {{ /toc }}

```

### Starter Kit

[](#starter-kit)

A Tailwind-styled partial ships with the addon as a starting point. It reads the `article` field from the current context:

```
{{ partial:statamic-toc::starter-kit }}

```

It takes the same parameters as the tag, plus a `title` for the label above the list:

```
{{ partial:statamic-toc::starter-kit
    field="content"
    depth="3"
    from="h2"
    title="On this page"
    exclude="Introduction, Footnotes"
}}

```

When the field holds no headings, the partial renders nothing at all, so you can drop it into a template without wrapping it in a condition.

To change the markup, publish it into your project:

```
php artisan vendor:publish --tag=statamic-toc-views
```

That copies the file to `resources/views/vendor/statamic-toc/starter-kit.antlers.html`.

Tailwind only sees classes in the files it scans. If you use the partial straight from the addon instead of publishing it, add the addon path to the content sources in your Tailwind config:

```
'./vendor/goldnead/statamic-toc/resources/views/**/*.html'
```

The partial only renders the list. The anchors point at the IDs the modifier injects, so the content field itself still needs `{{ your_field | toc }}`.

### Configuration

[](#configuration)

Optional. The addon works without it. To change the defaults, publish the config:

```
php artisan vendor:publish --tag=statamic-toc-config
```

```
// config/statamic-toc.php
return [
    'field' => 'article',  // the field the tag reads when none is given
    'from'  => 'h1',       // the level the list starts at
    'depth' => 3,          // how many levels it spans, counted from "from"
    'to'    => null,       // absolute end level; wins over "depth" when set
    'flat'  => false,      // flat array instead of a nested tree
];
```

Tag parameters always win over the config.

### Heading levels

[](#heading-levels)

`from` is the level the list starts at, `to` the level it stops at, both absolute:

```
{{ toc from="h2" to="h4" }}

```

`depth` says the same thing relative to `from`, and is what most templates use. `from="h2"` with `depth="3"` covers h2 to h4. When both `to` and `depth` are given, `to` wins.

### Excluding headings

[](#excluding-headings)

Pass `exclude` to leave individual headings out of the list. A comma-separated string matches case-insensitively on any part of the heading text:

```
{{ toc exclude="Introduction, Footnotes" }}

```

A delimited pattern is treated as a regular expression:

```
{{ toc exclude="/^Appendix/i" }}

```

The excluded headings still receive their IDs from the modifier, they are only omitted from the list.

### Conditional output

[](#conditional-output)

`when` switches the tag off without removing it from the template:

```
{{ toc :when="show_toc" }}

```

When it evaluates to `false`, the tag returns an empty list and `no_results` is true.

### The `toc:count` Tag

[](#the-toccount-tag)

Returns the number of headings the list would show. Give it the same parameters as the list, and it reports the same number:

```
{{ if {toc:count field="article" depth="3"} > 0 }}
  ...
{{ /if }}

```

### Variables

[](#variables)

Every Item has the following variables at your disposal:

VariableDescription`toc_title` *(string)*The title of the heading (Note: `title` would be more obvious, but this lead to some weird cascade issues.)` toc_id` *(string)*The slugified title to use as anchor-id`id` *(int)*The internal id used to assign children and parents` is_root` *(bool)*A flag to determine if the current heading is at root level`parent` *(int/null)*Id of parent item if current item is a child`has_children` *(bool)*Flag if current item has children`children` *(array)*Contains all the Child-headings`total_children` *(int)*Number of children (only if `has_children` is true)Also, there are the following global variables present inside the `toc` tag:

VariableDescription`total_results` *(int)*The number of total headings including children.`no_results` *(bool)*True if no results are present### Parameters

[](#parameters)

You can control the behaviour with the following tag-parameters:

ParameterDescription(Type) Default`depth`Specifies wich heading-depth the list includes*(int)* `3``is_flat`When true the list will be displayed as a flat array without nested `children`*(boolean)* `false``field`The name of the bard-field.*(string)* `"article"``content`Content of the bard-structure or HTML String*(string/array/null)* `null``from`The level the list starts at*(string)* `h1``to`The level the list stops at, absolute. Wins over `depth`*(string/null)* `null``exclude`Comma-separated headings or a regex pattern to omit from the list*(string/null)* `null``when`Returns an empty list when this evaluates to false*(bool)* `true`License
-------

[](#license)

This is commercial software. To use it in production you need to purchase a license at the [Statamic Marketplace](https://statamic.com/addons/goldnead/toc-for-bard-and-markdown). The terms are in [LICENSE](LICENSE).

###  Health Score

50

—

FairBetter than 95% of packages

Maintenance65

Regular maintenance activity

Popularity29

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity77

Established project with proven stability

 Bus Factor1

Top contributor holds 96.8% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~74 days

Recently: every ~0 days

Total

26

Last Release

17d ago

Major Versions

v1.10 → v2.0.02026-07-30

PHP version history (4 changes)v1.0.0PHP ^7.3|^8.0

v1.0.10PHP ^7.4 || ^8.0

v1.4PHP ^7.4 | ^8.0 | ^8.1 | ^8.2

v2.0.0PHP ^8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/85572d690277234a86834808cab169c4900922b4855fe9028426f8350dd74e97?d=identicon)[goldnead](/maintainers/goldnead)

---

Top Contributors

[![goldnead](https://avatars.githubusercontent.com/u/1313348?v=4)](https://github.com/goldnead "goldnead (121 commits)")[![janh-kramer](https://avatars.githubusercontent.com/u/87782824?v=4)](https://github.com/janh-kramer "janh-kramer (3 commits)")[![j6s](https://avatars.githubusercontent.com/u/3374170?v=4)](https://github.com/j6s "j6s (1 commits)")

---

Tags

bardmarkdownstatamic-addonstatamic-v3

### Embed Badge

![Health badge](/badges/goldnead-statamic-toc/health.svg)

```
[![Health](https://phpackages.com/badges/goldnead-statamic-toc/health.svg)](https://phpackages.com/packages/goldnead-statamic-toc)
```

###  Alternatives

[laravel/framework

The Laravel Framework.

34.9k556.2M21.5k](/packages/laravel-framework)[statamic/cms

The Statamic CMS Core Package

4.9k3.8M1.2k](/packages/statamic-cms)[tempest/framework

The PHP framework that gets out of your way.

2.3k37.6k21](/packages/tempest-framework)[helsingborg-stad/municipio

A bootstrap theme for creating municipality sites.

4028.6k10](/packages/helsingborg-stad-municipio)[code16/sharp

Laravel Content Management Framework

79466.1k10](/packages/code16-sharp)[statamic-rad-pack/runway

Eloquently manage your database models in Statamic.

137236.2k8](/packages/statamic-rad-pack-runway)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
