Quartz features an explorer that allows you to navigate all files and folders on your site. It supports nested folders and is highly customizable.
Info
The Explorer is now a community plugin. This demonstrates how external plugins can extend Quartz functionality while serving as a reference implementation for plugin developers.
Installation
The Explorer is available as a community plugin from GitHub:
By default, it shows all folders and files on your page. To display the explorer in a different spot, you can edit the layout.
Display names for folders get determined by the title frontmatter field in folder/index.md (more detail in Authoring Content). If this file does not exist or does not contain frontmatter, the local folder name will be used instead.
Info
The explorer uses local storage by default to save the state of your explorer. This is done to ensure a smooth experience when navigating to different pages.
To clear/delete the explorer state from local storage, delete the fileTree entry (guide on how to delete a key from local storage in chromium based browsers can be found here). You can disable this by passing useSavedState: false as an argument.
Customization
Most configuration can be done by passing in options to Explorer().
For example, hereโs what the default configuration looks like:
quartz.config.yaml
plugins: - source: github:quartz-community/explorer enabled: true options: title: Explorer folderClickBehavior: collapse # "link" to navigate or "collapse" to toggle folderDefaultState: collapsed # "collapsed" or "open" useSavedState: true layout: position: left priority: 50
For advanced options like custom sort, filter, and map functions, use the TS override in quartz.ts:
quartz.ts
import { loadQuartzConfig, loadQuartzLayout } from "./quartz/plugins/loader/config-loader"import { Explorer } from "@quartz-community/explorer"// Advanced: pass callback functions that can't be expressed in YAMLExplorer({ sortFn: (a, b) => { /* ... */ }, filterFn: (node) => { /* ... */ }, mapFn: (node) => { /* ... */ }, order: ["filter", "map", "sort"],})const config = await loadQuartzConfig()export default configexport const layout = await loadQuartzLayout()
When passing in your own options, you can omit any or all of these fields if youโd like to keep the default value for that field.
Want to customize it even more?
Removing explorer: remove the explorer entry from quartz.config.yaml or set enabled: false
(optional): After removing the explorer component, you can move the Table of Contents component back to the left part of the layout
Changing sort, filter and map behavior: explained in
Advanced customization
This component allows you to fully customize all of its behavior. You can pass a custom sort, filter and map function.
All functions you can pass work with the FileTrieNode class, which has the following properties:
Every function you can pass is optional. By default, only a sort function will be used:
Default sort function
// Sort order: folders first, then files. Sort folders and files alphabeticallyExplorer({ sortFn: (a, b) => { if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) { return a.displayName.localeCompare(b.displayName, undefined, { numeric: true, sensitivity: "base", }) } if (!a.isFolder && b.isFolder) { return 1 } else { return -1 } },})
You can pass your own functions for sortFn, filterFn and mapFn. All functions will be executed in the order provided by the order option (see ). These functions behave similarly to their Array.prototype counterpart, except they modify the entire FileNode tree in place instead of returning a new one.
The mapFn, filterFn, and sortFn options require JavaScript callback functions and cannot be expressed in YAML. Use the TS override for these.
Remove list of elements (filter)
Using this example, you can remove elements from your explorer by providing an array of folders/files to exclude.
Note that this example filters on the title but you can also do it via slug or any other field available on FileTrieNode.
quartz.ts (override)
Explorer({ filterFn: (node) => { // set containing names of everything you want to filter out const omit = new Set(["authoring content", "tags", "advanced"]) // can also use node.slug or by anything on node.data // note that node.data is only present for files that exist on disk // (e.g. implicit folder nodes that have no associated index.md) return !omit.has(node.displayName.toLowerCase()) },})
Remove files by tag
You can access the tags of a file by node.data.tags.
quartz.ts (override)
Explorer({ filterFn: (node) => { // exclude files with the tag "explorerexclude" return node.data?.tags?.includes("explorerexclude") !== true },})
Show every element in explorer
By default, the explorer will filter out the tags folder.
To override the default filter function, you can set the filter function to undefined.
quartz.ts (override)
Explorer({ filterFn: undefined, // apply no filter function, every file and folder will visible})
Advanced examples
Tip
When writing more complicated functions, the quartz.ts file can start to look very cramped.
You can fix this by defining your sort functions outside of the component
and passing it in.
quartz.ts
import { ExplorerOptions } from "@quartz-community/explorer/components"export const mapFn: ExplorerOptions["mapFn"] = (node) => { // implement your function here}export const filterFn: ExplorerOptions["filterFn"] = (node) => { // implement your function here}export const sortFn: ExplorerOptions["sortFn"] = (a, b) => { // implement your function here}Explorer({ // ... your other options mapFn, filterFn, sortFn,})
Add emoji prefix
To add emoji prefixes (๐ for folders, ๐ for files), you could use a map function in quartz.ts: