feat(v5): add plugin system (#2295)

* feat(plugins): v5 plugin system

* feat(plugins): explorer as community plugin

* feat(plugins): graph as community plugin

* chore: update package-lock.json

* chore: update package-lock.json

* docs: updated plugin-specific docs

* chore: update package-lock.json

* chore: update package-lock.json

* chore: update package-lock.json

* Implement Git-based plugin system with dogfooding for community plugins

- Remove npm dependencies for @quartz-community/* plugins

- Add gitLoader.ts for installing plugins from GitHub

- Update quartz.layout.ts to import from .quartz/plugins/

- Add install-plugins.ts script for prebuild hook

- Add .quartz/ to .gitignore

* Add comprehensive Git-based plugin CLI with lockfile support

- Create quartz.lock.json format for tracking exact plugin commits

- Add 'npx quartz plugin' commands: install, add, remove, update, list, restore

- Plugin state is fully reproducible via lockfile

- No npm dependencies required for community plugins

* Fix TypeScript errors in git-installed plugins

- Install @quartz-community/types as devDependency

- Fix plugin imports to define types locally

- Fix search inline script fetchData bug

- Format code with prettier

* fix(types): install types from github

* docs: updated plugin-specific docs

* Update Dockerfile and add CI/CD documentation

- Add plugin install step to Dockerfile

- Create docs/ci-cd.md with pipeline configuration guide

* Update GitHub Actions workflows for v5 branch and Git-based plugins

- Change branch references from v4 to v5

- Add plugin caching to speed up builds

- Use 'npx quartz plugin install' instead of 'restore'

- Update Docker workflow branch trigger

* Update quartz.lock.json with fixed plugin versions

* fix(docker): install command

* docs: add plugin migration analysis document

Comprehensive analysis of which Quartz v4 components and plugins
can be migrated to separate repositories, including:
- Component analysis (25 components)
- Plugin analysis (transformers, emitters, filters)
- Migration strategies for different plugin types
- Lessons learned from Explorer/Graph/Search migrations
- Recommended migration order

* chore: updated plugins

* chore: updated plugins

* chore: updated dependencies

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: tsconfig

* feat: build installed plugins

* chore: updated plugins

* chore: updated plugins

* chore: update explorer plugin with duplication fix

* docs: Quartz v5

* chore: update graph plugin with navigation fix

* fix: update explorer plugin with toggle fix

* fix: update explorer plugin - ensure toggle buttons always work

* fix: create plugin components once to prevent duplicate script registration

* chore: updated plugins

* chore: updated plugins

* feat: migrate 7 feature components to community plugins (Phase B)

Migrate ArticleTitle, TagList, PageTitle, Darkmode, ReaderMode,
ContentMeta, and Footer from internal components to community
plugins. Update layout to use Plugin.X() pattern, remove internal
component files and their styles/scripts.

Add MIGRATION_TASKS.md documenting the full migration roadmap.

* chore: updated plugins

* refactor: delete 6 internal component duplicates (Phase A)

Remove Backlinks, Breadcrumbs, RecentNotes, Search, TableOfContents,
Comments, and OverflowList — all replaced by community plugins.
Delete associated styles (6) and scripts (3). Switch layout to use
Plugin.Breadcrumbs() instead of Component.Breadcrumbs().

* refactor: unify QuartzComponent type to structural interface (Phase C)

- Changed QuartzComponent from ComponentType<QuartzComponentProps> to callable type ((props: QuartzComponentProps) => any)
- Added optional displayName property for better debugging
- Removed ComponentType import from preact
- Removed all 13 'as QuartzComponent' type casts from quartz.layout.ts
- Community plugin components now directly assignable without casts

* feat: add PageType plugin infrastructure (Phase D Step 4)

* feat: add PageTypePluginEntry for cross-boundary type compatibility

Introduce PageTypePluginEntry with never[] parameter types to accept
both internal and community PageType plugins in config arrays without
casts, working around branded FullSlug contravariance mismatch.

* refactor: update dispatcher to cast PageTypePluginEntry at boundary

Add getPageTypes() helper that casts config's PageTypePluginEntry[]
to QuartzPageTypePluginInstance[] in one place. Cast VirtualPage.slug
to FullSlug at emitPage/defaultProcessedContent call sites.

* feat: integrate community PageType plugins (Phase D Step 6)

Replace old page-rendering emitters with PageTypeDispatcher emitter
and pageTypes array. Restructure quartz.layout.ts from three separate
exports to unified layout object with defaults and byPageType record.
Install content-page, folder-page, tag-page community plugins.

* refactor: delete old page-rendering emitters

Remove ContentPage, FolderPage, TagPage, and NotFoundPage emitters
now replaced by community PageType plugins and the PageTypeDispatcher.

* refactor: remove migrated page body components

Delete Content, FolderContent, TagContent page components now provided
by community PageType plugins. Update components barrel export.

* fix: update lockfile to fixed folder-page and tag-page commits

Points to commits that remove duplicate PageList/SortFn re-exports,
fixing TS2300 duplicate identifier errors in generated plugin index.

* chore: updated plugins

* fix: populate ctx.trie in PageTypeDispatcher before rendering

Components like FolderContent depend on ctx.trie for folder hierarchy.
The dispatcher now lazily initializes it via trieFromAllFiles in emit
and force-rebuilds it in partialEmit to reflect file changes.

* chore: update lockfile to fixed folder-page commit

* chore: updated plugins

* chore: update explorer plugin to fix SPA folder navigation

* feat: extract transformers to community plugins and fix type compatibility

- Delete 12 internal transformer files (keep FrontMatter as internal)
- Switch quartz.config.ts to use ExternalPlugin.* for all transformers
- Align branded types with @quartz-community/types (_brand, FullSlug etc.)
- Add vfile DataMap augmentations for fields from extracted transformers
- Update all 29 plugins to @quartz-community/types v0.2.1

* Migrate filters to external plugins (remove-draft, explicit-publish)

Delete internal RemoveDrafts and ExplicitPublish filter implementations,
install them as community plugins, and update quartz.config.ts to use
ExternalPlugin.RemoveDrafts().

* Migrate emitters to external plugins (alias-redirects, cname, favicon, content-index, og-image)

* refactor: remove inline scripts/styles migrated to plugins

Delete dead code: callout, checkbox, mermaid inline scripts and styles
are now bundled by the obsidian-flavored-markdown plugin. Clipboard
script and styles moved to the syntax-highlighting plugin. listPage.scss
was unreferenced. Body.tsx simplified to a pure layout wrapper.

* refactor: consolidate utils to re-export from @quartz-community/utils

* fix: use dangerouslySetInnerHTML for inline CSS to prevent HTML-escaping

Preact was escaping & characters in SCSS-compiled CSS (e.g. & nesting)
into &amp;, breaking CSS rules. Using dangerouslySetInnerHTML bypasses
the escaping, matching how browsers expect style element content.

* chore: update plugins with inline script transpilation fix

* chore: updated plugins

* docs: update plugin API sections for v5 community plugins

* docs: rewrite documentation for v5 plugin system

Update feature docs, hosting, CI/CD, getting started, configuration,
layout, architecture, creating components, making plugins, and
migration guide to reflect the v5 community plugin architecture.

* docs: fix outdated v4 references in documentation

* chore: remove completed migration planning docs

* chore: updated plugins

* chore: cleanup

* chore: cleanup

* chore: bump version to 5.0.0

* chore: updated dependencies

* feat: integrate CanvasPage plugin with types, assets, config, layout, and documentation

* chore: updated dependencies

* chore: updated dependencies

* chore: updated linter

* chore: update canvas-page plugin to c942fcb

* chore: updated plugins

* chore: update canvas-page plugin to f88f1b9

* chore: updated plugins

* chore: update canvas-page plugin to 079304c

* chore: updated plugins

* chore: canvas layout

* chore: update canvas-page plugin to 38d49e1

* chore: updated plugins

* chore: update canvas-page plugin to 505c099

* chore: updated plugins

* chore: updated plugins

* fix: Obsidian flavored markdown

* fix: Obsidian flavored markdown

* fix: Obsidian flavored markdown

* chore: cleanup

* chore: updated plugins

* feat: configuration files

* feat: Quartz TUI

* feat(tui): YAML configuration

* chore: tsup

* chore: tsup

* feat: support array categories in plugin manifests

Plugins like note-properties export both transformer and component
functionality. Allow PluginManifest.category to be a single value
or an array, with config-loader resolving to the first processing
category (transformer/filter/emitter/pageType) for dispatch.

* refactor: remove built-in FrontMatter transformer

Frontmatter processing is now handled by the note-properties plugin,
which provides the same YAML/TOML parsing plus link extraction and
a visual properties panel. The built-in transformer is no longer needed.

* feat: add note-properties plugin to default configuration

Register note-properties as the first plugin (order 5) in both
the user config and the default config. Placed in beforeBody layout
zone with priority 15 (between article-title at 10 and content-meta at 20).

* docs: add plugin management strategy and syncer v5 notes

Document the plugin management system design decisions and provide
implementation guidance for the Quartz Syncer v5 integration.

* feat: add bases-page plugin to default configuration

Enable Obsidian Bases (.base) file support with bases page type
and layout entry in both user and default config.

* docs: update syncer notes with bases-page, note-properties, and spacer

Add all three new plugins to the quick reference table (40 total).
Add content, canvas, and bases page types to byPageType documentation.

* chore: updated plugins

* fix: update CI to Node 24 and regenerate lockfiles for clean install

* fix: resolve type errors for CI checks

* chore: updated plugins

* chore: updated plugins

* fix: plugin mapping from configuration

* fix: CI

* fix: CI

* docs: rewrite Frontmatter documentation for note-properties plugin

* chore: updated plugins

* docs: Quartz v5

* chore: updated plugins

* chore: updated plugins

* refactor: extract TUI to standalone plugin repository

* chore: linting

* docs: Quartz v5

* feat: update and upgrade commands

* chore: updated plugins

* chore: updated plugins

* chore: cleanup

* chore: cleanup

* chore: cleanup

* chore: cleanup

* chore: cleanup

* fix: layout group priority

* fix: view classes

* fix: include virtual pages in content index for explorer visibility

* docs: add board, gallery, and cards view examples to navigation page

* chore: updated plugins

* fix: include virtualPages in worker serializable build context

* fix: set relativePath on virtual pages to prevent explorer crash

* fix: exclude 404

* fix(links): virtual page links

* fix(links): virtual page transclusion

* docs: architecture overview

* fix: only call scripts one per page

* fix: type error in component registry instantiate method

* fix: left layout order

* fix(layout): remove tag-list by default

* docs(plugins): updated plugin list defaults

* fix(layout): priorities

* feat: add PageFrame system for custom page layouts

* feat: integrate PageFrame into rendering pipeline

* feat: add frame resolution to page type dispatcher and config loader

* style: add CSS grid overrides for full-width and minimal page frames

* feat: set minimal frame for 404 and update canvas-page plugin

* docs: add PageFrame system to architecture overview

* fix: wrap frame.render() in array to satisfy Body children type

* chore: format

* fix: use absolute asset paths for 404 page so it works in subdirectories

* fix(layout): priorities

* docs: page frames

* feat: add FrameRegistry for plugin-provided page frames

Plugins can now register custom page frames via their manifest's
'frames' field. Frames are loaded alongside components during plugin
initialization and resolved by name at render time with fallback
to built-in frames.

* feat(layout): page frames

* fix(layout): linting

* fix: inject frame CSS into page so plugin-provided frames render correctly

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* docs: canvas

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* feat: add TreeTransform hook, fix multi-category plugins, and resolve cross-plugin dependencies

- Add TreeTransform type and treeTransforms hook to pageType plugins, enabling
  render-time HAST tree mutations (e.g. bases-page inline codeblock resolution)
- Fix config-loader to push multi-category plugins into ALL matching processing
  buckets instead of only the first match
- Add side-effect import for component-only plugins so view registrations
  (e.g. leaflet-map via globalThis ViewRegistry) execute at load time
- Add npm prune --omit=dev and cross-plugin peer dependency symlinking to
  buildPlugin() to prevent duplicate-singleton issues from nested node_modules

* chore: format

* chore: test docs

* chore: updated plugins

* fix: prevent HTML-escaping of inline style and script content in htmlToJsx

Add dangerouslySetInnerHTML overrides for <style> and <script> elements
so that CSS/JS injected by tree transforms is not HTML-escaped during
preact-render-to-string serialization.

* chore: update plugin lockfile for htmlToJsx migration

* chore: update leaflet-map plugin (fix deferred L.Control)

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: updated plugins

* chore: test npx quartz upgrade

* feat(templates): add obsidian, ttrpg, blog templates

* docs: move bases

* docs: removed leaflet demo

* feat(cli): configure baseUrl during create

* docs: updated cli commands

* docs: updated documentation for v5

* feat(cli): prune and resolve

* chore: rebuild lockfile

* docs: cli documentation

* docs: plugin development and setup guide

* chore: deleted redundant files

* fix(build): fallback config

* chore: updated lockfile

* docs: removed outdated v3 setup

* feat(cli): allow non-default branch plugins

* docs: install branch commands

* feat(cli): allow local plugins

* docs: install local commands

* feat: add render event type and listener for in-place DOM re-initialization

* docs: add EncryptedPages plugin documentation

* docs: add encrypted pages live demo page

- New password-protected demo page (password: quartz) showing the plugin in action
- Link to demo from EncryptedPages plugin page with password hint callout

* feat: add encrypted-pages plugin to all templates

- Enabled by default in default, obsidian, and ttrpg templates
- Disabled by default in blog template

* chore: updated plugins

* chore: updated layouts

* chore: updated plugins

* feat: stacked pages

* feat: added stacked page panes

* docs: touch-ups
This commit is contained in:
Emile Bangma
2026-03-14 18:10:02 +01:00
committed by GitHub
parent bc99b4a636
commit ab346fa66a
254 changed files with 14718 additions and 11192 deletions

View File

@@ -33,5 +33,6 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.AliasRedirects()`.
- Source: [`quartz/plugins/emitters/aliases.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/aliases.ts).
- Function name: `ExternalPlugin.AliasRedirects()`.
- Source: [`quartz-community/alias-redirects`](https://github.com/quartz-community/alias-redirects)
- Install: `npx quartz plugin add github:quartz-community/alias-redirects`

View File

@@ -0,0 +1,19 @@
---
title: ArticleTitle
tags:
- plugin/component
---
This plugin renders the article title from the page's frontmatter as an `<h1>` heading at the top of the page content. It reads the `title` field from frontmatter (falling back to the filename if no title is set).
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
This plugin has no configuration options.
## API
- Category: Component
- Function name: `ExternalPlugin.ArticleTitle()`.
- Source: [`quartz-community/article-title`](https://github.com/quartz-community/article-title)
- Install: `npx quartz plugin add github:quartz-community/article-title`

View File

@@ -16,5 +16,5 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.Assets()`.
- Source: [`quartz/plugins/emitters/assets.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/assets.ts).
- Function name: `Plugin.Assets()` (internal plugin).
- Source: [`quartz/plugins/emitters/assets.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/assets.ts).

34
docs/plugins/Backlinks.md Normal file
View File

@@ -0,0 +1,34 @@
---
title: Backlinks
tags:
- plugin/component
---
Shows pages that link to the current page.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[backlinks]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `hideWhenEmpty`: Hide the backlinks section if the current page has no backlinks. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/backlinks
enabled: true
options:
hideWhenEmpty: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.Backlinks()`.
- Source: [`quartz-community/backlinks`](https://github.com/quartz-community/backlinks)
- Install: `npx quartz plugin add github:quartz-community/backlinks`

60
docs/plugins/BasesPage.md Normal file
View File

@@ -0,0 +1,60 @@
---
title: BasesPage
tags:
- plugin/pageType
- plugin/component
---
This plugin provides support for [Obsidian Bases](https://obsidian.md/changelog/2025-04-15-desktop-v1.8.0/) (`.base` files) in Quartz. It reads `.base` files from your vault, resolves matching notes based on the query definition, and renders them as interactive database-like views with support for tables, lists, cards, and maps. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars).
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
## Features
- **Table view**: Sortable columns with automatic type rendering (strings, numbers, booleans, arrays, links).
- **List view**: Compact list with metadata chips for each entry.
- **Cards view**: Card layout with optional image property support.
- **Map view**: Placeholder for future map-based visualization.
- **Multiple views**: A single `.base` file can define multiple views, displayed as switchable tabs.
- **Filters**: Recursive filter trees with `and`/`or`/`not` operators.
- **Formulas**: Computed properties via formula expressions.
- **Summaries**: Column-level aggregations (Sum, Average, Min, Max, Median, etc.).
- **Property configuration**: Custom display names for properties.
- **Link rendering**: Wikilinks and Markdown links within cell values are rendered as clickable links.
## Configuration
This plugin accepts the following configuration options:
- `defaultViewType`: The default view type when none is specified in the `.base` file. Defaults to `"table"`.
- `customViews`: A map of custom view renderers. Keys are view type names. These override built-in renderers for the same type, or add new view types. Requires a TS override.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/bases-page
enabled: true
```
For custom view renderers, use a TS override in `quartz.ts`:
```ts title="quartz.ts (override)"
import * as ExternalPlugin from "./.quartz/plugins"
ExternalPlugin.BasesPage({
defaultViewType: "table",
customViews: {
myView: ({ entries, view, basesData, total, locale }) => {
// return JSX
},
},
})
```
## API
- Category: Page Type, Component
- Function name: `ExternalPlugin.BasesPage()`.
- Source: [`quartz-community/bases-page`](https://github.com/quartz-community/bases-page)
- Install: `npx quartz plugin add github:quartz-community/bases-page`

View File

@@ -0,0 +1,40 @@
---
title: Breadcrumbs
tags:
- plugin/component
---
Navigation breadcrumb trail.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[breadcrumbs]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `spacerSymbol`: The symbol to use between breadcrumb items. Defaults to `""`.
- `rootName`: The name of the root page. Defaults to `Home`.
- `resolveFrontmatterTitle`: Whether to use the `title` frontmatter field for breadcrumb items. Defaults to `true`.
- `showCurrentPage`: Whether to show the current page in the breadcrumb trail. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/breadcrumbs
enabled: true
options:
spacerSymbol: ""
rootName: Home
resolveFrontmatterTitle: true
showCurrentPage: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.Breadcrumbs()`.
- Source: [`quartz-community/breadcrumbs`](https://github.com/quartz-community/breadcrumbs)
- Install: `npx quartz plugin add github:quartz-community/breadcrumbs`

View File

@@ -18,5 +18,6 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.CNAME()`.
- Source: [`quartz/plugins/emitters/cname.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/cname.ts).
- Function name: `ExternalPlugin.CNAME()`.
- Source: [`quartz-community/cname`](https://github.com/quartz-community/cname)
- Install: `npx quartz plugin add github:quartz-community/cname`

View File

@@ -0,0 +1,53 @@
---
title: CanvasPage
tags:
- plugin/pageType
---
This plugin is a page type plugin that renders [JSON Canvas](https://jsoncanvas.org) (`.canvas`) files as interactive, pannable and zoomable canvas pages. It uses a custom `"canvas"` [[layout#Page Frames|page frame]] that provides a fullscreen, always-on canvas experience with a togglable left sidebar for navigation. It supports the full [JSON Canvas 1.0 spec](https://jsoncanvas.org/spec/1.0/), including text nodes with Markdown rendering, file nodes that link to other pages in your vault, link nodes for external URLs, and group nodes for visual organization. Edges between nodes are rendered as SVG paths with optional labels, arrow markers, and colors.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
This plugin accepts the following configuration options:
- `enableInteraction`: Whether to enable pan and zoom interaction on the canvas. Default: `true{:ts}`.
- `initialZoom`: The initial zoom level when the canvas is first displayed. Default: `1{:ts}`.
- `minZoom`: The minimum zoom level allowed when zooming out. Default: `0.1{:ts}`.
- `maxZoom`: The maximum zoom level allowed when zooming in. Default: `5{:ts}`.
### Canvas Frame
The canvas-page plugin provides its own `"canvas"` page frame via the [[layout#Page Frames|Frame Registry]]. This frame:
- Renders the canvas in **fullscreen mode** by default (100vw × 100vh), giving the canvas maximum screen space — leaning into the "endless canvas" concept of JSON Canvas.
- Provides a **togglable left sidebar** that slides in from the left edge. This is the only layout slot available — it renders the same components as the `left` sidebar on content pages (e.g., Explorer, Search, Page Title).
- The sidebar toggle button (hamburger/close icon) is positioned in the top-left corner.
- Canvas controls (zoom in, zoom out, reset) are positioned on the right side.
- On mobile, the sidebar overlays the canvas rather than pushing it aside.
Users can override this frame via `quartz.config.yaml` if needed:
```yaml title="quartz.config.yaml"
layout:
byPageType:
canvas:
template: default # Use standard three-column layout instead
```
### Features
- **Text nodes**: Render Markdown content including headings, bold, italic, strikethrough, lists, links, and code blocks via [GFM](https://github.github.com/gfm/) support.
- **File nodes**: Link to other pages in your vault. Supports popover previews on hover.
- **Link nodes**: Reference external URLs.
- **Group nodes**: Visual grouping containers with optional labels and background colors.
- **Edges**: SVG connections between nodes with optional labels, arrow markers, and colors. Supports all four sides (top, right, bottom, left) and both preset colors (16) and custom hex colors.
- **Togglable sidebar**: Hamburger button in the top-left corner toggles the left sidebar for navigation. Press `Escape` or click the close button to dismiss.
- **Preset colors**: Six preset colors (red, orange, yellow, green, cyan, purple) plus custom hex colors (`#RRGGBB`) for nodes and edges.
## API
- Category: Page Type
- Function name: `ExternalPlugin.CanvasPage()`.
- Source: [`quartz-community/canvas-page`](https://github.com/quartz-community/canvas-page)
- Install: `npx quartz plugin add github:quartz-community/canvas-page`

View File

@@ -20,5 +20,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.Citations()`.
- Source: [`quartz/plugins/transformers/citations.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/citations.ts).
- Function name: `ExternalPlugin.Citations()`.
- Source: [`quartz-community/citations`](https://github.com/quartz-community/citations)
- Install: `npx quartz plugin add github:quartz-community/citations`

53
docs/plugins/Comments.md Normal file
View File

@@ -0,0 +1,53 @@
---
title: Comments
tags:
- plugin/component
---
Comment system (giscus, utterances, etc.).
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[comments]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `provider`: The comment provider to use. Currently only `giscus` is supported.
- `options`: Provider-specific options.
- `repo`: The GitHub repository to use for comments.
- `repoId`: The ID of the GitHub repository.
- `category`: The discussion category to use.
- `categoryId`: The ID of the discussion category.
- `lang`: The language for the comment system. Defaults to `en`.
- `themeUrl`: URL to a folder with custom themes.
- `lightTheme`: Filename for the light theme CSS file. Defaults to `light`.
- `darkTheme`: Filename for the dark theme CSS file. Defaults to `dark`.
- `mapping`: How to map pages to discussions. Defaults to `url`.
- `strict`: Use strict title matching. Defaults to `true`.
- `reactionsEnabled`: Whether to enable reactions for the main post. Defaults to `true`.
- `inputPosition`: Where to put the comment input box relative to the comments. Defaults to `bottom`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/comments
enabled: true
options:
provider: giscus
options:
repo: jackyzha0/quartz
repoId: MDEwOlJlcG9zaXRvcnkzODcyMTMyMDg
category: Announcements
categoryId: DIC_kwDOFxRnmM4B-Xg6
lang: en
```
## API
- Category: Component
- Function name: `ExternalPlugin.Comments()`.
- Source: [`quartz-community/comments`](https://github.com/quartz-community/comments)
- Install: `npx quartz plugin add github:quartz-community/comments`

View File

@@ -14,5 +14,5 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.ComponentResources()`.
- Source: [`quartz/plugins/emitters/componentResources.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/componentResources.ts).
- Function name: `Plugin.ComponentResources()` (internal plugin).
- Source: [`quartz/plugins/emitters/componentResources.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/componentResources.ts).

View File

@@ -23,5 +23,6 @@ This plugin accepts the following configuration options:
## API
- Category: Emitter
- Function name: `Plugin.ContentIndex()`.
- Source: [`quartz/plugins/emitters/contentIndex.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/contentIndex.ts).
- Function name: `ExternalPlugin.ContentIndex()`.
- Source: [`quartz-community/content-index`](https://github.com/quartz-community/content-index)
- Install: `npx quartz plugin add github:quartz-community/content-index`

View File

@@ -0,0 +1,34 @@
---
title: ContentMeta
tags:
- plugin/component
---
This plugin displays content metadata below the article title, such as the creation date and estimated reading time.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
## Configuration
This plugin accepts the following configuration options:
- `showReadingTime`: Whether to display the estimated reading time. Defaults to `true`.
- `showComma`: Whether to display a comma between metadata items. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/content-meta
enabled: true
options:
showReadingTime: true
showComma: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.ContentMeta()`.
- Source: [`quartz-community/content-meta`](https://github.com/quartz-community/content-meta)
- Install: `npx quartz plugin add github:quartz-community/content-meta`

View File

@@ -1,10 +1,10 @@
---
title: ContentPage
tags:
- plugin/emitter
- plugin/pageType
---
This plugin is a core component of the Quartz framework. It generates the HTML pages for each piece of Markdown content. It emits the full-page [[layout]], including headers, footers, and body content, among others.
This plugin is a page type plugin for the Quartz framework. It generates the HTML pages for each piece of Markdown content. It emits the full-page [[layout]], including headers, footers, and body content, among others. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). It is now configured in the `pageTypes` section of `quartz.config.yaml`.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
@@ -13,6 +13,7 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.ContentPage()`.
- Source: [`quartz/plugins/emitters/contentPage.tsx`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/contentPage.tsx).
- Category: Page Type
- Function name: `ExternalPlugin.ContentPage()`.
- Source: [`quartz-community/content-page`](https://github.com/quartz-community/content-page)
- Install: `npx quartz plugin add github:quartz-community/content-page`

View File

@@ -26,5 +26,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.CrawlLinks()`.
- Source: [`quartz/plugins/transformers/links.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/links.ts).
- Function name: `ExternalPlugin.CrawlLinks()`.
- Source: [`quartz-community/crawl-links`](https://github.com/quartz-community/crawl-links)
- Install: `npx quartz plugin add github:quartz-community/crawl-links`

View File

@@ -16,12 +16,13 @@ This plugin accepts the following configuration options:
When loading the frontmatter, the value of [[Frontmatter#List]] is used.
> [!warning]
> If you rely on `git` for dates, make sure `defaultDateType` is set to `modified` in `quartz.config.ts`.
> If you rely on `git` for dates, make sure `defaultDateType` is set to `modified` in `quartz.config.yaml`.
>
> Depending on how you [[hosting|host]] your Quartz, the `filesystem` dates of your local files may not match the final dates. In these cases, it may be better to use `git` or `frontmatter` to guarantee correct dates.
## API
- Category: Transformer
- Function name: `Plugin.CreatedModifiedDate()`.
- Source: [`quartz/plugins/transformers/lastmod.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/lastmod.ts).
- Function name: `ExternalPlugin.CreatedModifiedDate()`.
- Source: [`quartz-community/created-modified-date`](https://github.com/quartz-community/created-modified-date)
- Install: `npx quartz plugin add github:quartz-community/created-modified-date`

View File

@@ -25,22 +25,29 @@ The Custom OG Images emitter plugin generates social media preview images for yo
This plugin accepts the following configuration options:
```typescript title="quartz.config.ts"
import { CustomOgImages } from "./quartz/plugins/emitters/ogImage"
```yaml title="quartz.config.yaml"
plugins:
- source: github:quartz-community/og-image
enabled: true
options:
colorScheme: lightMode # "lightMode" or "darkMode"
width: 1200
height: 630
excludeRoot: false
```
const config: QuartzConfig = {
plugins: {
emitters: [
CustomOgImages({
colorScheme: "lightMode", // what colors to use for generating image, same as theme colors from config, valid values are "darkMode" and "lightMode"
width: 1200, // width to generate with (in pixels)
height: 630, // height to generate with (in pixels)
excludeRoot: false, // wether to exclude "/" index path to be excluded from auto generated images (false = use auto, true = use default og image)
imageStructure: defaultImage, // custom image component to use
}),
],
},
}
For the TS override approach (needed for custom `imageStructure`):
```ts title="quartz.ts (override)"
import { defaultImage } from "./quartz/plugins/emitters/ogImage"
CustomOgImages({
colorScheme: "lightMode",
width: 1200,
height: 630,
excludeRoot: false,
imageStructure: defaultImage, // custom JSX component — requires TS
})
```
### Configuration Options
@@ -76,7 +83,7 @@ You can fully customize how the images being generated look by passing your own
### Fonts
You will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.ts` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the "body" font family).
You will also be passed an array containing a header and a body font (where the first entry is header and the second is body). The fonts matches the ones selected in `theme.typography.header` and `theme.typography.body` from `quartz.config.yaml` and will be passed in the format required by [`satori`](https://github.com/vercel/satori). To use them in CSS, use the `.name` property (e.g. `fontFamily: fonts[1].name` to use the "body" font family).
An example of a component using the header font could look like this:
@@ -358,3 +365,10 @@ export const og: SocialImageOptions["Component"] = (
)
}
```
## API
- Category: Emitter
- Function name: `ExternalPlugin.CustomOgImages()`.
- Source: [`quartz-community/og-image`](https://github.com/quartz-community/og-image)
- Install: `npx quartz plugin add github:quartz-community/og-image`

32
docs/plugins/Darkmode.md Normal file
View File

@@ -0,0 +1,32 @@
---
title: Darkmode
tags:
- plugin/component
---
Dark mode toggle.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[darkmode]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `enabled`: Whether to enable the dark mode toggle. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/darkmode
enabled: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.Darkmode()`.
- Source: [`quartz-community/darkmode`](https://github.com/quartz-community/darkmode)
- Install: `npx quartz plugin add github:quartz-community/darkmode`

View File

@@ -19,5 +19,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.Description()`.
- Source: [`quartz/plugins/transformers/description.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/description.ts).
- Function name: `ExternalPlugin.Description()`.
- Source: [`quartz-community/description`](https://github.com/quartz-community/description)
- Install: `npx quartz plugin add github:quartz-community/description`

View File

@@ -0,0 +1,25 @@
---
title: Encrypted Pages Demo
password: quartz
tags:
- plugin/transformer
---
Congratulations! You've successfully decrypted this page. 🎉
This is a live demo of the [[EncryptedPages]] plugin. The content you're reading was encrypted at build time using AES-256-GCM and decrypted in your browser using the Web Crypto API.
## What just happened?
1. At build time, the plugin read the `password` field from this page's frontmatter and encrypted all content below the title.
2. When you visited this page, you were shown a password prompt instead of the page content.
3. After entering the correct password, the plugin derived an encryption key using PBKDF2 and decrypted the content client-side.
4. A `render` event was dispatched so other components (graph, explorer, etc.) could re-initialize with the decrypted content.
## Password caching
Your password has been cached in session storage. If there were other encrypted pages on this site, the plugin would automatically try this password before showing the prompt — so you'd only need to enter it once per session for pages that share the same password.
## Try it yourself
To add encrypted pages to your own Quartz site, install the plugin and add a `password` field to any page's frontmatter. See [[EncryptedPages]] for full setup instructions.

View File

@@ -0,0 +1,72 @@
---
title: EncryptedPages
tags:
- plugin/transformer
- plugin/filter
---
Password-protected encrypted pages. Encrypts page content at build time using AES-256-GCM and decrypts client-side with the Web Crypto API. Passwords are set per-page via frontmatter.
> [!example] Live demo
> Try it yourself: [[EncryptedPages Demo]]. The password is `quartz`.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
## Usage
Add a `password` field to any page's frontmatter to encrypt it:
```yaml
---
title: My Secret Page
password: mysecretpassword
---
```
The page content will be encrypted at build time. Visitors must enter the correct password to view the content.
Successful passwords are cached in the browser's session storage and automatically tried on other encrypted pages for convenience.
## Configuration
This plugin provides a transformer, a filter, and a component.
### Transformer options
- `visibility`: How encrypted pages appear in graph, explorer, and backlinks. `"visible"` shows the page normally, `"icon"` adds a lock indicator, `"hidden"` hides the page completely. Defaults to `"icon"`.
- `iterations`: PBKDF2 iteration count for key derivation. Higher values are more secure but slower to unlock. Defaults to `600000`.
- `passwordField`: Frontmatter field name that holds the page password. Defaults to `"password"`.
### Filter options
- `visibility`: Controls whether encrypted pages appear in search, RSS, and sitemap. When set to `"hidden"`, encrypted pages are excluded from content indices entirely. Defaults to `"icon"`.
### Component options
- `className`: CSS class for the component wrapper. Defaults to `"encrypted-page-wrapper"`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/encrypted-pages
enabled: true
options:
visibility: icon
iterations: 600000
passwordField: password
```
## Security
- Content is encrypted with AES-256-GCM using PBKDF2 SHA-256 key derivation.
- Plaintext is stripped from search indices and RSS feeds regardless of visibility setting.
- Passwords are set per-page in frontmatter. Avoid committing passwords to public repositories.
- This is client-side encryption of a static site. It protects against casual browsing but not against determined attackers with access to the page source.
## API
- Category: Transformer, Filter
- Function name: `ExternalPlugin.EncryptedPages()`, `ExternalPlugin.EncryptedPageFilter()`.
- Source: [`quartz-community/encrypted-pages`](https://github.com/quartz-community/encrypted-pages)
- Install: `npx quartz plugin add github:quartz-community/encrypted-pages`

View File

@@ -14,5 +14,6 @@ This plugin has no configuration options.
## API
- Category: Filter
- Function name: `Plugin.ExplicitPublish()`.
- Source: [`quartz/plugins/filters/explicit.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/filters/explicit.ts).
- Function name: `ExternalPlugin.ExplicitPublish()`.
- Source: [`quartz-community/explicit-publish`](https://github.com/quartz-community/explicit-publish)
- Install: `npx quartz plugin add github:quartz-community/explicit-publish`

40
docs/plugins/Explorer.md Normal file
View File

@@ -0,0 +1,40 @@
---
title: Explorer
tags:
- plugin/component
---
File tree explorer sidebar.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[explorer]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `title`: The title of the explorer. Defaults to `Explorer`.
- `folderClickBehavior`: The behavior when a folder is clicked. Can be `"link"` to navigate or `"collapse"` to toggle. Defaults to `collapse`.
- `folderDefaultState`: The default state of folders. Can be `"collapsed"` or `"open"`. Defaults to `collapsed`.
- `useSavedState`: Whether to use local storage to save the state of the explorer. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/explorer
enabled: true
options:
title: Explorer
folderClickBehavior: collapse
folderDefaultState: collapsed
useSavedState: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.Explorer()`.
- Source: [`quartz-community/explorer`](https://github.com/quartz-community/explorer)
- Install: `npx quartz plugin add github:quartz-community/explorer`

View File

@@ -15,5 +15,6 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.Favicon()`.
- Source: [`quartz/plugins/emitters/favicon.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/favicon.ts).
- Function name: `ExternalPlugin.Favicon()`.
- Source: [`quartz-community/favicon`](https://github.com/quartz-community/favicon)
- Install: `npx quartz plugin add github:quartz-community/favicon`

View File

@@ -1,24 +1,23 @@
---
title: FolderPage
tags:
- plugin/emitter
- plugin/pageType
---
This plugin generates index pages for folders, creating a listing page for each folder that contains multiple content files. See [[folder and tag listings]] for more information.
This plugin is a page type plugin that generates index pages for folders, creating a listing page for each folder that contains multiple content files. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.
Example: [[advanced/|Advanced]]
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
The pages are displayed using the `defaultListPageLayout` in `quartz.layouts.ts`. For the content, the `FolderContent` component is used. If you want to modify the layout, you must edit it directly (`quartz/components/pages/FolderContent.tsx`).
This plugin accepts the following configuration options:
- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order.
## API
- Category: Emitter
- Function name: `Plugin.FolderPage()`.
- Source: [`quartz/plugins/emitters/folderPage.tsx`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/folderPage.tsx).
- Category: Page Type
- Function name: `ExternalPlugin.FolderPage()`.
- Source: [`quartz-community/folder-page`](https://github.com/quartz-community/folder-page)
- Install: `npx quartz plugin add github:quartz-community/folder-page`

34
docs/plugins/Footer.md Normal file
View File

@@ -0,0 +1,34 @@
---
title: Footer
tags:
- plugin/component
---
This plugin renders a footer at the bottom of the page with a "Created with Quartz" message and a set of configurable links.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
## Configuration
This plugin accepts the following configuration options:
- `links`: A map of link labels to their URLs to display in the footer. Defaults to `{}`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/footer
enabled: true
options:
links:
GitHub: https://github.com/jackyzha0/quartz
Discord Community: https://discord.gg/cRFFHYye7t
```
## API
- Category: Component
- Function name: `ExternalPlugin.Footer()`.
- Source: [`quartz-community/footer`](https://github.com/quartz-community/footer)
- Install: `npx quartz plugin add github:quartz-community/footer`

View File

@@ -1,72 +1,107 @@
---
title: "Frontmatter"
aliases:
- note-properties
- Note Properties
description: "Parses frontmatter and displays note properties in a collapsible panel."
tags:
- plugin/transformer
- plugin/component
publish: true
enableToc: true
---
This plugin parses the frontmatter of the page using the [gray-matter](https://github.com/jonschlinkert/gray-matter) library. See [[authoring content#Syntax]], [[Obsidian compatibility]] and [[OxHugo compatibility]] for more information.
This plugin parses the frontmatter of the page using the [gray-matter](https://github.com/jonschlinkert/gray-matter) library and optionally displays selected properties in a collapsible panel. See [[authoring content#Syntax]], [[Obsidian compatibility]] and [[OxHugo compatibility]] for more information.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
> [!warning]
> This plugin must not be removed, otherwise Quartz will break.
## Configuration
This plugin accepts the following configuration options:
- `delimiters`: the delimiters to use for the frontmatter. Can have one value (e.g. `"---"`) or separate values for opening and closing delimiters (e.g. `["---", "~~~"]`). Defaults to `"---"`.
- `language`: the language to use for parsing the frontmatter. Can be `yaml` (default) or `toml`.
- `includeAll`: include all frontmatter properties in the properties panel. When `false`, only `includedProperties` are shown. Defaults to `false`.
- `includedProperties`: properties to include when `includeAll` is `false`. Defaults to `["description", "tags", "aliases"]`.
- `excludedProperties`: properties to always exclude from display, even when `includeAll` is `true`. Defaults to `[]`.
- `hidePropertiesView`: hide the visual properties panel while still processing frontmatter. Useful if you only need frontmatter parsing without the UI. Defaults to `false`.
> [!warning]
> This plugin must not be removed, otherwise Quartz will break.
### Default options
## List
```yaml title="quartz.config.yaml"
- source: github:quartz-community/note-properties
enabled: true
options:
includeAll: false
includedProperties:
- description
- tags
- aliases
excludedProperties: []
hidePropertiesView: false
delimiters: "---"
language: yaml
```
Quartz supports the following frontmatter:
## Properties panel
- title
- `title`
- description
- `description`
- permalink
- `permalink`
- comments
- `comments`
- lang
- `lang`
- publish
- `publish`
- draft
- `draft`
- enableToc
- `enableToc`
- tags
- `tags`
- `tag`
- aliases
- `aliases`
- `alias`
- cssclasses
- `cssclasses`
- `cssclass`
- socialDescription
- `socialDescription`
- socialImage
- `socialImage`
- `image`
- `cover`
- created
- `created`
- `date`
- modified
- `modified`
- `lastmod`
- `updated`
- `last-modified`
- published
- `published`
- `publishDate`
- `date`
When enabled, this plugin renders a collapsible "Properties" panel before the page body. The panel displays selected frontmatter fields in a table with automatic type rendering:
- **Strings** are shown as plain text. [[Wikilinks]] and [markdown links](https://example.com) within strings are rendered as clickable links.
- **Arrays** are rendered as comma-separated lists.
- **Booleans** are rendered as disabled checkboxes.
- **Numbers** are rendered in a monospace font.
- **Objects** are rendered as JSON in a code block.
- **Tags** get special treatment: they are rendered as highlighted links that point to the corresponding tag page.
- **Null/undefined** values are shown as an em-dash (—).
### Per-note overrides
You can control the properties panel on a per-note basis using frontmatter keys:
- `quartz-properties` (or `quartzProperties`): set to `true` to force-show the panel, or `false` to force-hide it, overriding the global `hidePropertiesView` setting.
- `quartz-properties-collapse` (or `quartzPropertiesCollapse`): set to `true` to start the panel collapsed, or `false` to start it expanded, overriding the default collapse state.
These keys are automatically excluded from the visible properties table.
```yaml title="Example frontmatter"
---
title: My Note
quartz-properties: true
quartz-properties-collapse: false
---
```
## Supported frontmatter
Quartz supports the following frontmatter fields. Where multiple keys are listed, they are aliases — the first matching key is used.
| Field | Keys | Description |
| ------------------ | ------------------------------------------------- | ------------------------------------------------------------------ |
| Title | `title` | Page title. Falls back to filename if empty. |
| Description | `description` | Page description for metadata and search. |
| Tags | `tags`, `tag` | Categorization tags. Automatically slugified. |
| Aliases | `aliases`, `alias` | Alternative names for the page, used for link resolution. |
| Permalink | `permalink` | Custom URL slug. Also added to aliases. |
| CSS classes | `cssclasses`, `cssclass` | CSS classes applied to the page body. |
| Social image | `socialImage`, `image`, `cover` | Image used for social media previews. |
| Social description | `socialDescription` | Description used specifically for social media previews. |
| Created date | `created`, `date` | When the note was created. |
| Modified date | `modified`, `lastmod`, `updated`, `last-modified` | When the note was last modified. Falls back to `created` if unset. |
| Published date | `published`, `publishDate`, `date` | When the note was published. |
| Publish | `publish` | Whether the note should be published. |
| Draft | `draft` | Whether the note is a draft. |
| Comments | `comments` | Whether comments are enabled for the note. |
| Language | `lang` | Language code for the note. |
| Enable TOC | `enableToc` | Whether to show the table of contents. |
## API
- Category: Transformer
- Function name: `Plugin.Frontmatter()`.
- Source: [`quartz/plugins/transformers/frontmatter.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/frontmatter.ts).
- Category: Transformer, Component
- Function name: `ExternalPlugin.NoteProperties()`.
- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)
- Install: `npx quartz plugin add github:quartz-community/note-properties`

View File

@@ -19,5 +19,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.GitHubFlavoredMarkdown()`.
- Source: [`quartz/plugins/transformers/gfm.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/gfm.ts).
- Function name: `ExternalPlugin.GitHubFlavoredMarkdown()`.
- Source: [`quartz-community/github-flavored-markdown`](https://github.com/quartz-community/github-flavored-markdown)
- Install: `npx quartz plugin add github:quartz-community/github-flavored-markdown`

77
docs/plugins/Graph.md Normal file
View File

@@ -0,0 +1,77 @@
---
title: Graph
tags:
- plugin/component
---
Interactive graph visualization.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[graph view]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `localGraph`: Options for the local graph view.
- `globalGraph`: Options for the global graph view.
Both `localGraph` and `globalGraph` accept the following options:
- `drag`: Enable dragging nodes. Defaults to `true`.
- `zoom`: Enable zooming. Defaults to `true`.
- `depth`: The depth of the graph. Defaults to `1` for local and `-1` for global.
- `scale`: The initial scale of the graph.
- `repelForce`: The force that pushes nodes apart.
- `centerForce`: The force that pulls nodes to the center.
- `linkDistance`: The distance between linked nodes.
- `fontSize`: The font size of node labels.
- `opacityScale`: The scale of node opacity.
- `removeTags`: Tags to exclude from the graph.
- `showTags`: Whether to show tags in the graph.
- `enableRadial`: Whether to enable radial layout.
- `focusOnHover`: Whether to focus on the hovered node (global only).
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/graph
enabled: true
options:
localGraph:
drag: true
zoom: true
depth: 1
scale: 1.1
repelForce: 0.5
centerForce: 0.3
linkDistance: 30
fontSize: 0.6
opacityScale: 1
removeTags: []
showTags: true
enableRadial: false
globalGraph:
drag: true
zoom: true
depth: -1
scale: 0.9
repelForce: 0.5
centerForce: 0.3
linkDistance: 30
fontSize: 0.6
opacityScale: 1
removeTags: []
showTags: true
focusOnHover: true
enableRadial: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.Graph()`.
- Source: [`quartz-community/graph`](https://github.com/quartz-community/graph)
- Install: `npx quartz plugin add github:quartz-community/graph`

View File

@@ -14,5 +14,6 @@ This plugin has no configuration options.
## API
- Category: Transformer
- Function name: `Plugin.HardLineBreaks()`.
- Source: [`quartz/plugins/transformers/linebreaks.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/linebreaks.ts).
- Function name: `ExternalPlugin.HardLineBreaks()`.
- Source: [`quartz-community/hard-line-breaks`](https://github.com/quartz-community/hard-line-breaks)
- Install: `npx quartz plugin add github:quartz-community/hard-line-breaks`

View File

@@ -17,5 +17,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.Latex()`.
- Source: [`quartz/plugins/transformers/latex.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/latex.ts).
- Function name: `ExternalPlugin.Latex()`.
- Source: [`quartz-community/latex`](https://github.com/quartz-community/latex)
- Install: `npx quartz plugin add github:quartz-community/latex`

View File

@@ -1,10 +1,10 @@
---
title: NotFoundPage
tags:
- plugin/emitter
- plugin/pageType
---
This plugin emits a 404 (Not Found) page for broken or non-existent URLs.
This plugin emits a 404 (Not Found) page for broken or non-existent URLs. It uses the `minimal` [[layout#Page Frames|page frame]] (no sidebars, no header or beforeBody chrome — only content and footer) to present a clean error page.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
@@ -13,6 +13,6 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.NotFoundPage()`.
- Source: [`quartz/plugins/emitters/404.tsx`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/404.tsx).
- Category: Page Type
- Function name: `Plugin.NotFoundPage()` (internal plugin).
- Source: [`quartz/plugins/pageTypes/404.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/pageTypes/404.ts)

View File

@@ -0,0 +1,17 @@
---
title: NoteProperties
tags:
- plugin/component
---
The NoteProperties plugin is documented under [[Frontmatter]].
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
## API
- Category: Component
- Function name: `ExternalPlugin.NoteProperties()`.
- Source: [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties)
- Install: `npx quartz plugin add github:quartz-community/note-properties`

View File

@@ -17,12 +17,13 @@ This plugin accepts the following configuration options:
- `callouts`: If `true` (default), adds support for [[callouts|callout]] blocks for emphasizing content.
- `mermaid`: If `true` (default), enables [[Mermaid diagrams|Mermaid diagram]] rendering within Markdown files.
- `parseTags`: If `true` (default), parses and links tags within the content.
- `parseArrows`: If `true` (default), transforms arrow symbols into their HTML character equivalents.
- `parseBlockReferences`: If `true` (default), handles block references, linking to specific content blocks.
- `enableInHtmlEmbed`: If `true`, allows embedding of content directly within HTML. Defaults to `false`.
- `enableYouTubeEmbed`: If `true` (default), enables the embedding of YouTube videos and playlists using external image Markdown syntax.
- `enableTweetEmbed`: If `true` (default), enables the embedding of tweets as static blockquotes from Twitter/X URLs.
- `enableVideoEmbed`: If `true` (default), enables the embedding of video files.
- `enableCheckbox`: If `true`, adds support for interactive checkboxes in content. Defaults to `false`.
- `enableCheckbox`: If `true`, adds support for interactive checkboxes in content, including custom task characters (e.g. `- [?]`, `- [!]`, `- [/]`). Defaults to `false`.
- `enableObsidianUri`: If `true` (default), marks `obsidian://` protocol links with a CSS class and data attribute for custom styling.
- `disableBrokenWikilinks`: If `true`, replaces links to non-existent notes with a dimmed, disabled link. Defaults to `false`.
> [!warning]
@@ -31,5 +32,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.ObsidianFlavoredMarkdown()`.
- Source: [`quartz/plugins/transformers/ofm.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/ofm.ts)
- Function name: `ExternalPlugin.ObsidianFlavoredMarkdown()`.
- Source: [`quartz-community/obsidian-flavored-markdown`](https://github.com/quartz-community/obsidian-flavored-markdown)
- Install: `npx quartz plugin add github:quartz-community/obsidian-flavored-markdown`

View File

@@ -25,5 +25,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.OxHugoFlavoredMarkdown()`.
- Source: [`quartz/plugins/transformers/oxhugofm.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/oxhugofm.ts).
- Function name: `ExternalPlugin.OxHugoFlavoredMarkdown()`.
- Source: [`quartz-community/ox-hugo`](https://github.com/quartz-community/ox-hugo)
- Install: `npx quartz plugin add github:quartz-community/ox-hugo`

19
docs/plugins/PageTitle.md Normal file
View File

@@ -0,0 +1,19 @@
---
title: PageTitle
tags:
- plugin/component
---
This plugin renders the site-wide page title (configured via the `pageTitle` field in [[configuration]]) as a clickable link to the home page. It typically appears in the left sidebar.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
This plugin has no configuration options. The displayed title is controlled by the `pageTitle` field in `quartz.config.yaml`.
## API
- Category: Component
- Function name: `ExternalPlugin.PageTitle()`.
- Source: [`quartz-community/page-title`](https://github.com/quartz-community/page-title)
- Install: `npx quartz plugin add github:quartz-community/page-title`

View File

@@ -0,0 +1,32 @@
---
title: ReaderMode
tags:
- plugin/component
---
Distraction-free reading mode.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[reader mode]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `enabled`: Whether to enable reader mode. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/reader-mode
enabled: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.ReaderMode()`.
- Source: [`quartz-community/reader-mode`](https://github.com/quartz-community/reader-mode)
- Install: `npx quartz plugin add github:quartz-community/reader-mode`

View File

@@ -0,0 +1,40 @@
---
title: RecentNotes
tags:
- plugin/component
---
Shows recently modified notes.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[recent notes]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `title`: The title of the recent notes section. Defaults to `Recent notes`.
- `limit`: The maximum number of recent notes to display. Defaults to `5`.
- `showTags`: Whether to display the tags for each note. Defaults to `true`.
- `linkToMore`: A slug to a page that shows more notes. Defaults to `""`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/recent-notes
enabled: true
options:
title: Recent notes
limit: 5
showTags: true
linkToMore: ""
```
## API
- Category: Component
- Function name: `ExternalPlugin.RecentNotes()`.
- Source: [`quartz-community/recent-notes`](https://github.com/quartz-community/recent-notes)
- Install: `npx quartz plugin add github:quartz-community/recent-notes`

View File

@@ -14,5 +14,6 @@ This plugin has no configuration options.
## API
- Category: Filter
- Function name: `Plugin.RemoveDrafts()`.
- Source: [`quartz/plugins/filters/draft.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/filters/draft.ts).
- Function name: `ExternalPlugin.RemoveDrafts()`.
- Source: [`quartz-community/remove-draft`](https://github.com/quartz-community/remove-draft)
- Install: `npx quartz plugin add github:quartz-community/remove-draft`

View File

@@ -22,5 +22,6 @@ This plugin accepts the following configuration options:
## API
- Category: Transformer
- Function name: `Plugin.RoamFlavoredMarkdown()`.
- Source: [`quartz/plugins/transformers/roam.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/roam.ts).
- Function name: `ExternalPlugin.RoamFlavoredMarkdown()`.
- Source: [`quartz-community/roam`](https://github.com/quartz-community/roam)
- Install: `npx quartz plugin add github:quartz-community/roam`

32
docs/plugins/Search.md Normal file
View File

@@ -0,0 +1,32 @@
---
title: Search
tags:
- plugin/component
---
Full-text search functionality.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
See [[full-text search]] for detailed usage information.
## Configuration
This plugin accepts the following configuration options:
- `enabled`: Whether to enable full-text search. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/search
enabled: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.Search()`.
- Source: [`quartz-community/search`](https://github.com/quartz-community/search)
- Install: `npx quartz plugin add github:quartz-community/search`

19
docs/plugins/Spacer.md Normal file
View File

@@ -0,0 +1,19 @@
---
title: Spacer
tags:
- plugin/component
---
This plugin renders a flexible spacer element that pushes adjacent components apart within a layout group. It uses CSS `flex: 2 1 auto` to fill available space, making it useful for spacing out items in toolbars or sidebars (for example, separating the search bar from the darkmode toggle in the left sidebar toolbar).
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
This plugin has no configuration options.
## API
- Category: Component
- Function name: `ExternalPlugin.Spacer()`.
- Source: [`quartz-community/spacer`](https://github.com/quartz-community/spacer)
- Install: `npx quartz plugin add github:quartz-community/spacer`

View File

@@ -0,0 +1,59 @@
---
title: StackedPages
tags:
- plugin/component
---
Andy Matuschak-style stacked pages (sliding panes). Clicking internal links opens pages side by side in a horizontal stack, allowing you to trace your path through your notes. Each pane shows a full page and can be individually scrolled or closed.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
## Usage
Once enabled, clicking any internal link on a page opens the linked page as a new pane to the right instead of navigating away. The URL updates with a `#stacked=slug1,slug2` hash encoding your current stack, so you can share or bookmark a specific trail of pages.
Stacked pages are disabled on mobile by default (below 800px) since horizontal panning doesn't work well on small screens. On mobile, links navigate normally.
### Interactions
- **Click a link**: Opens the target page in a new pane to the right. If the maximum number of panes is reached, the leftmost pane is removed.
- **Close a pane**: Click the × button in the pane header to remove it from the stack.
- **Collapsed spines**: When panes overflow the viewport, earlier panes collapse to a thin vertical spine showing the page title. Click a spine to bring that pane back into focus.
- **Browser back/forward**: The full stack state is stored in the URL hash and integrated with browser history, so back/forward navigation works as expected.
## Configuration
This plugin accepts the following configuration options:
- `paneWidth`: Width of each stacked pane in pixels. Defaults to `640`.
- `maxPanes`: Maximum number of panes visible at once. Defaults to `5`.
- `enableOnMobile`: Whether to enable stacked pages on mobile devices. Defaults to `false`.
- `mobileBreakpoint`: Viewport width (in pixels) below which the mobile behavior applies. Matches the Quartz mobile breakpoint. Defaults to `800`.
- `showSpines`: Whether to show collapsed spine headers when panes overflow. Defaults to `true`.
- `animateTransitions`: Whether to animate pane open/close transitions. Defaults to `true`.
### Default options
```yaml title="quartz.config.yaml"
- source: github:quartz-community/stacked-pages
enabled: true
layout:
position: afterBody
priority: 50
display: all
options:
paneWidth: 640
maxPanes: 5
enableOnMobile: false
mobileBreakpoint: 800
showSpines: true
animateTransitions: true
```
## API
- Category: Component
- Function name: `ExternalPlugin.StackedPages()`.
- Source: [`quartz-community/stacked-pages`](https://github.com/quartz-community/stacked-pages)
- Install: `npx quartz plugin add github:quartz-community/stacked-pages`

View File

@@ -17,5 +17,5 @@ This plugin has no configuration options.
## API
- Category: Emitter
- Function name: `Plugin.Static()`.
- Source: [`quartz/plugins/emitters/static.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/static.ts).
- Function name: `Plugin.Static()` (internal plugin).
- Source: [`quartz/plugins/emitters/static.ts`](https://github.com/jackyzha0/quartz/blob/v5/quartz/plugins/emitters/static.ts).

View File

@@ -19,5 +19,6 @@ In addition, you can further override the colours in the `quartz/styles/syntax.s
## API
- Category: Transformer
- Function name: `Plugin.SyntaxHighlighting()`.
- Source: [`quartz/plugins/transformers/syntax.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/syntax.ts).
- Function name: `ExternalPlugin.SyntaxHighlighting()`.
- Source: [`quartz-community/syntax-highlighting`](https://github.com/quartz-community/syntax-highlighting)
- Install: `npx quartz plugin add github:quartz-community/syntax-highlighting`

View File

@@ -17,10 +17,11 @@ This plugin accepts the following configuration options:
- `collapseByDefault`: If `true`, the TOC will start in a collapsed state. Default is `false`.
> [!warning]
> This plugin needs the `Component.TableOfContents` component in `quartz.layout.ts` to determine where to display the TOC. Without it, nothing will be displayed. They should always be added or removed together.
> This plugin needs the `Plugin.TableOfContents` component in `quartz.config.yaml` to determine where to display the TOC. Without it, nothing will be displayed. They should always be added or removed together.
## API
- Category: Transformer
- Function name: `Plugin.TableOfContents()`.
- Source: [`quartz/plugins/transformers/toc.ts`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/transformers/toc.ts).
- Function name: `ExternalPlugin.TableOfContentsTransformer()`.
- Source: [`quartz-community/table-of-contents`](https://github.com/quartz-community/table-of-contents)
- Install: `npx quartz plugin add github:quartz-community/table-of-contents`

19
docs/plugins/TagList.md Normal file
View File

@@ -0,0 +1,19 @@
---
title: TagList
tags:
- plugin/component
---
This plugin renders the page's tags as a list of clickable links. Each tag links to its corresponding [[TagPage|tag page]], making it easy for readers to browse related content by topic.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
This plugin has no configuration options.
## API
- Category: Component
- Function name: `ExternalPlugin.TagList()`.
- Source: [`quartz-community/tag-list`](https://github.com/quartz-community/tag-list)
- Install: `npx quartz plugin add github:quartz-community/tag-list`

View File

@@ -1,22 +1,21 @@
---
title: TagPage
tags:
- plugin/emitter
- plugin/pageType
---
This plugin emits dedicated pages for each tag used in the content. See [[folder and tag listings]] for more information.
This plugin is a page type plugin that emits dedicated pages for each tag used in the content. It uses the `default` [[layout#Page Frames|page frame]] (three-column layout with sidebars). See [[folder and tag listings]] for more information.
> [!note]
> For information on how to add, remove or configure plugins, see the [[configuration#Plugins|Configuration]] page.
The pages are displayed using the `defaultListPageLayout` in `quartz.layouts.ts`. For the content, the `TagContent` component is used. If you want to modify the layout, you must edit it directly (`quartz/components/pages/TagContent.tsx`).
This plugin accepts the following configuration options:
- `sort`: A function of type `(f1: QuartzPluginData, f2: QuartzPluginData) => number{:ts}` used to sort entries. Defaults to sorting by date and tie-breaking on lexographical order.
## API
- Category: Emitter
- Function name: `Plugin.TagPage()`.
- Source: [`quartz/plugins/emitters/tagPage.tsx`](https://github.com/jackyzha0/quartz/blob/v4/quartz/plugins/emitters/tagPage.tsx).
- Category: Page Type
- Function name: `ExternalPlugin.TagPage()`.
- Source: [`quartz-community/tag-page`](https://github.com/quartz-community/tag-page)
- Install: `npx quartz plugin add github:quartz-community/tag-page`

View File

@@ -1,3 +1,89 @@
---
title: Plugins
---
Quartz's functionality is provided by a collection of first-party community plugins. Each plugin can be enabled, disabled, and configured via `quartz.config.yaml`. See [[configuration#Plugins|Configuration]] for details on how to manage plugins.
> [!info] Internal vs Community Plugins
> Quartz has two kinds of plugins:
>
> - **Community plugins** are standalone repositories under [`quartz-community`](https://github.com/quartz-community). In TS overrides, they use `ExternalPlugin.X()` (imported from `.quartz/plugins`).
> - **Internal plugins** are built into Quartz core (Assets, Static, ComponentResources, NotFoundPage). In TS overrides, they use `Plugin.X()` (imported from `./quartz/plugins`).
## Plugin types
Quartz plugins fall into several categories:
- **Transformers** process content during the build, e.g. parsing frontmatter, highlighting syntax, or resolving links.
- **Filters** decide which content files to include or exclude from the output.
- **Page Types** generate HTML pages — one per content file, folder, tag, canvas, or bases view.
- **Components** render UI elements in the page layout (sidebars, headers, footers, etc.).
## First-party plugins
### Transformers
| Plugin | Repository | Enabled | Required | Description |
| -------------------------------- | --------------------------------------------------------------------------------------------------------------- | :-----: | :------: | ---------------------------------------------------------- |
| [[Frontmatter\|Note Properties]] | [`quartz-community/note-properties`](https://github.com/quartz-community/note-properties) | ✅ | ✅ | Parses frontmatter and displays note properties. |
| [[CreatedModifiedDate]] | [`quartz-community/created-modified-date`](https://github.com/quartz-community/created-modified-date) | ✅ | ❌ | Determines creation and modification dates. |
| [[SyntaxHighlighting]] | [`quartz-community/syntax-highlighting`](https://github.com/quartz-community/syntax-highlighting) | ✅ | ❌ | Syntax highlighting for code blocks. |
| [[ObsidianFlavoredMarkdown]] | [`quartz-community/obsidian-flavored-markdown`](https://github.com/quartz-community/obsidian-flavored-markdown) | ✅ | ❌ | Obsidian-specific Markdown extensions. |
| [[GitHubFlavoredMarkdown]] | [`quartz-community/github-flavored-markdown`](https://github.com/quartz-community/github-flavored-markdown) | ✅ | ❌ | GitHub Flavored Markdown support. |
| [[TableOfContents]] | [`quartz-community/table-of-contents`](https://github.com/quartz-community/table-of-contents) | ✅ | ❌ | Generates table of contents data from headings. |
| [[CrawlLinks]] | [`quartz-community/crawl-links`](https://github.com/quartz-community/crawl-links) | ✅ | ⚠️ | Parses and resolves links. Removing it is not recommended. |
| [[Description]] | [`quartz-community/description`](https://github.com/quartz-community/description) | ✅ | ❌ | Generates page descriptions for metadata. |
| [[Latex]] | [`quartz-community/latex`](https://github.com/quartz-community/latex) | ✅ | ❌ | Renders LaTeX math expressions. |
| [[Citations]] | [`quartz-community/citations`](https://github.com/quartz-community/citations) | ❌ | ❌ | Academic citation support via BibTeX. |
| [[HardLineBreaks]] | [`quartz-community/hard-line-breaks`](https://github.com/quartz-community/hard-line-breaks) | ❌ | ❌ | Treats single newlines as hard line breaks. |
| [[OxHugoFlavoredMarkdown]] | [`quartz-community/ox-hugo`](https://github.com/quartz-community/ox-hugo) | ❌ | ❌ | ox-hugo Markdown compatibility. |
| [[RoamFlavoredMarkdown]] | [`quartz-community/roam`](https://github.com/quartz-community/roam) | ❌ | ❌ | Roam Research Markdown compatibility. |
### Filters
| Plugin | Repository | Enabled | Required | Description |
| ------------------- | ------------------------------------------------------------------------------------------- | :-----: | :------: | --------------------------------------- |
| [[RemoveDrafts]] | [`quartz-community/remove-draft`](https://github.com/quartz-community/remove-draft) | ✅ | ❌ | Filters out pages marked as drafts. |
| [[ExplicitPublish]] | [`quartz-community/explicit-publish`](https://github.com/quartz-community/explicit-publish) | ❌ | ❌ | Only publishes pages explicitly marked. |
### Page Types
| Plugin | Repository | Enabled | Required | Description |
| --------------- | ----------------------------------------------------------------------------------- | :-----: | :------: | ----------------------------------------------- |
| [[ContentPage]] | [`quartz-community/content-page`](https://github.com/quartz-community/content-page) | ✅ | ❌ | Generates HTML pages for Markdown content. |
| [[FolderPage]] | [`quartz-community/folder-page`](https://github.com/quartz-community/folder-page) | ✅ | ❌ | Generates folder listing pages. |
| [[TagPage]] | [`quartz-community/tag-page`](https://github.com/quartz-community/tag-page) | ✅ | ❌ | Generates tag listing pages. |
| [[CanvasPage]] | [`quartz-community/canvas-page`](https://github.com/quartz-community/canvas-page) | ✅ | ❌ | Renders JSON Canvas files as interactive pages. |
| [[BasesPage]] | [`quartz-community/bases-page`](https://github.com/quartz-community/bases-page) | ✅ | ❌ | Renders Obsidian Bases files as database views. |
### Emitters
| Plugin | Repository | Enabled | Required | Description |
| ---------------------------- | ----------------------------------------------------------------------------------------- | :-----: | :------: | ----------------------------------------------- |
| [[AliasRedirects]] | [`quartz-community/alias-redirects`](https://github.com/quartz-community/alias-redirects) | ✅ | ❌ | Generates redirect pages for aliases. |
| [[ContentIndex]] | [`quartz-community/content-index`](https://github.com/quartz-community/content-index) | ✅ | ❌ | Generates sitemap, RSS feed, and content index. |
| [[Favicon]] | [`quartz-community/favicon`](https://github.com/quartz-community/favicon) | ✅ | ❌ | Emits the site favicon. |
| [[CustomOgImages\|OG Image]] | [`quartz-community/og-image`](https://github.com/quartz-community/og-image) | ✅ | ❌ | Generates Open Graph social preview images. |
| [[CNAME]] | [`quartz-community/cname`](https://github.com/quartz-community/cname) | ✅ | ❌ | Emits a CNAME file for custom domains. |
### Components
| Plugin | Repository | Enabled | Required | Description |
| ------------------------------ | ----------------------------------------------------------------------------------------- | :-----: | :------: | ------------------------------------------- |
| [[ArticleTitle]] | [`quartz-community/article-title`](https://github.com/quartz-community/article-title) | ✅ | ❌ | Renders the article title as an h1 heading. |
| [[ContentMeta]] | [`quartz-community/content-meta`](https://github.com/quartz-community/content-meta) | ✅ | ❌ | Displays creation date and reading time. |
| [[TagList]] | [`quartz-community/tag-list`](https://github.com/quartz-community/tag-list) | ❌ | ❌ | Renders tags as clickable links. |
| [[PageTitle]] | [`quartz-community/page-title`](https://github.com/quartz-community/page-title) | ✅ | ❌ | Renders the site title as a home link. |
| [[darkmode\|Darkmode]] | [`quartz-community/darkmode`](https://github.com/quartz-community/darkmode) | ✅ | ❌ | Toggle between light and dark themes. |
| [[reader mode\|Reader Mode]] | [`quartz-community/reader-mode`](https://github.com/quartz-community/reader-mode) | ✅ | ❌ | Distraction-free reading mode toggle. |
| [[explorer\|Explorer]] | [`quartz-community/explorer`](https://github.com/quartz-community/explorer) | ✅ | ❌ | File tree explorer sidebar. |
| [[graph view\|Graph View]] | [`quartz-community/graph`](https://github.com/quartz-community/graph) | ✅ | ❌ | Interactive link graph visualization. |
| [[full-text search\|Search]] | [`quartz-community/search`](https://github.com/quartz-community/search) | ✅ | ❌ | Full-text search functionality. |
| [[backlinks\|Backlinks]] | [`quartz-community/backlinks`](https://github.com/quartz-community/backlinks) | ✅ | ❌ | Shows pages that link to the current page. |
| [[breadcrumbs\|Breadcrumbs]] | [`quartz-community/breadcrumbs`](https://github.com/quartz-community/breadcrumbs) | ✅ | ❌ | Breadcrumb navigation trail. |
| [[comments\|Comments]] | [`quartz-community/comments`](https://github.com/quartz-community/comments) | ❌ | ❌ | Comment system integration (Giscus, etc.). |
| [[Footer]] | [`quartz-community/footer`](https://github.com/quartz-community/footer) | ✅ | ❌ | Page footer with configurable links. |
| [[recent notes\|Recent Notes]] | [`quartz-community/recent-notes`](https://github.com/quartz-community/recent-notes) | ❌ | ❌ | Displays a list of recently modified notes. |
| [[Spacer]] | [`quartz-community/spacer`](https://github.com/quartz-community/spacer) | ✅ | ❌ | Flexible spacer for layout groups. |
| [[EncryptedPages]] | [`quartz-community/encrypted-pages`](https://github.com/quartz-community/encrypted-pages) | ✅ | ❌ | Password-protected encrypted pages. |
| [[StackedPages]] | [`quartz-community/stacked-pages`](https://github.com/quartz-community/stacked-pages) | ✅ | ❌ | Andy Matuschak-style stacked sliding panes. |