These are most of the changes implemented in my Quartz setup, including where I've found them (if I didn't write them myself). The list is ordered based on arbitrary categories which make it easy for me to find what I'm looking for. Perhaps, this resource might prove useful to others as well.
Functional Changes
Components
Confidence Tags and Page Description
Modified the ContentMeta.tsx file to display the page description for all single pages and added a Confidence tag. Original meta content (dates, tags etc.) and page description are wrapped in separate blocks. Blocks are returned separately so they display one after another within the page header.
initially planned to display different levels of confidence in different colors but the idea fell through
page description has lighter font weight than other body text
separator changed from a comma to a 4-pointed star, ’🟄’
Show
ContentMeta.tsx
// Custom confidence tagsconst ConfidenceTagElement = (score: number): JSX.Element | null => { if (score < 1 || score > 5 || isNaN(score)) { return null; } // Determine the CSS class based on the score value (High/Medium/Low) let confidenceClass = "confidence-low"; if (score >= 4) { confidenceClass = "confidence-high"; } else if (score === 3) { confidenceClass = "confidence-medium"; } return ( <span className={`confidence-tag ${confidenceClass}`}> <a class="internal tag-link" href="./index/#confidence-tags">confidence:</a> {score} </span> );};export default ((opts?: Partial<ContentMetaOptions>) => { // Merge options with defaults const options: ContentMetaOptions = { ...defaultOptions, ...opts } function ContentMetadata({ cfg, fileData, displayClass }: QuartzComponentProps) { const text = fileData.text // Custom description: pull from frontmatter const description = fileData.frontmatter?.description if (text) { const segments: (string | JSX.Element)[] = [] if (fileData.dates && fileData.slug !== "index") { /* Excludes index */ segments.push(<Date date={getDate(cfg, fileData)!} locale={cfg.locale} />) } // Custom confidence tag if (fileData.slug !== "index") { /* Excludes index */ const confidenceScore = fileData.frontmatter?.['confidence-score'] as number; if (confidenceScore) { const tagElement = ConfidenceTagElement(confidenceScore); if (tagElement) { segments.push(tagElement); } } }// Custom Render the segments together in a block so the bottom return() statement can output custom blocks at a time const segmentsBlock = ( // Custom change from 'comma' to 'separator', and customized separator <p show-separator={options.showSeparator} class={classNames(displayClass, "content-meta")}> {segments.map((segment, i) => ( <> {segment} {i < segments.length - 1 && <span class="separator">🟄</span>} </> ))} </p> ) // Custom Render the description block const shouldShowDescription = description && fileData.slug !== "index"; // Excludes index const descriptionBlock = shouldShowDescription ? ( <p class={classNames(displayClass, "page-description")}> {description} </p> ) : null return ( <> {descriptionBlock} {segmentsBlock} </> /* default <p show-comma={options.showSeparator} class={classNames(displayClass, "content-meta")}> {segments} </p> */ ) } else { return null } } ContentMetadata.css = style return ContentMetadata}) satisfies QuartzComponentConstructor
Custom Date Formats
Added an extra argument to formatDate() in Date.tsx so that it specifies whether to return the date in "default_text", "numeric_short" or "numeric_long"
Show
Date.tsx
interface Props { date: Date locale?: ValidLocale format?: ValidDateFormat; // Gemini: Add the optional format prop}export type ValidDateType = keyof Required<QuartzPluginData>["dates"]export function getDate(cfg: GlobalConfiguration, data: QuartzPluginData): Date | undefined { if (!cfg.defaultDateType) { throw new Error( `Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://>>quartz.jzhao.xyz/configuration#general-configuration for more details.`, ) } return data.dates?.[cfg.defaultDateType]}// Define the valid formats export type ValidDateFormat = "default_text" | "numeric_short" | "numeric_long";export function formatDate( d: Date, locale: ValidLocale = "en-US", format: ValidDateFormat = "default_text" // Set a default format): string { // Switch statement to apply the formatting based on 'format' prop switch (format) { case "numeric_short": { // YY-MM format (e.g., 2025-11) const numericMonth = d.toLocaleDateString(locale, { month: "2-digit" }); // args: "2-digit", "short", "long" const fullYear = d.toLocaleDateString(locale, { year: "numeric" }); const shortYear = fullYear.slice(-2); return `${fullYear}-${numericMonth}`; // change to shortYear if desired (e.g., 25-11) } case "numeric_long": { // DD/MM/YY format (e.g., 2025-11-01) const numericMonth = d.toLocaleDateString(locale, { month: "2-digit" }); const day = d.toLocaleDateString(locale, { day: "2-digit" }); const fullYear = d.toLocaleDateString(locale, { year: "numeric" }); return `${fullYear}-${numericMonth}-${day}`; // sep is '-' } case "default_text": default: { // MONTH DD, YYYY format: (e.g., Nov 25, 2025) const monthName = d.toLocaleDateString(locale, { month: "short" }); const day = d.toLocaleDateString(locale, { day: "2-digit" }); const fullYear = d.toLocaleDateString(locale, { year: "numeric" }); return `${monthName} ${day}, ${fullYear}`; } }}// Pass the format prop to the formatDate functionexport function Date({ date, locale, format }: Props) { return ( <time datetime={date.toISOString()}> {formatDate(date, locale, format)} </time> );}
PageList.tsx
… <p class="meta"> { page.dates && <Date date={getDate(cfg, page)!} locale={cfg.locale} format={"numeric_short"} /> // added format as an arg } </p>…
used to specify a layout for certain pages (by specifying their titles) in quartz.layout.ts
used to put recentNotes component on afterBody on the New page
RecentNotes
Modified from Eilleen’s (online!) Everything Notebook, the RecentNotes component has its own .tsx and .scss files for building and styling the UI respectively.
Lists most recent pages, sorted by publish date
pages can be filtered by tag from quartz.layout.ts
used to create a list of tags to exclude for other components in quartz.layout.ts
Reminder
Add all new components into index.ts too so that they are accessible.
Presentation Changes
Asset Integration
Site Logo
created site logo as svg file
changed the alignment of page title
changed width and height prop to logo size
removed border bottom
page title opacity reduce
page title opacity change on hover
Not shown: svg imported into PageTitle.tsx and size adjusted
custom.scss
.page-title { /* Ensure the link is also a flex container to align the icon and text */ display: flex; align-items: center; width: 10rem; // prop to logo size height: 9rem; // prop to logo size padding: 0.2rem; border-bottom-color: transparent;}.page-title a { opacity: 0.4; transition: opacity 0.4s ease; margin: 0;}.page-title a:hover { opacity: 0.7;}
Favicon: Replaced
created 150×150 favicon logo as svg file
save as quartz\public\static\icon.png
clear cache and it should render without issue
Show
Adjustments to Grid Layout
increased $sidePanelWidth and columnGap for desktop
variables.scss
…$sidePanelWidth: 370px; // 300px default, 250px for slim side panels…$desktopGrid: ( templateRows: "auto auto auto", templateColumns: "#{$sidePanelWidth} auto #{$sidePanelWidth}", rowGap: "5px", columnGap: "10px", // 5px default columnGap templateAreas: '"grid-sidebar-left grid-header grid-sidebar-right"\ "grid-sidebar-left grid-center grid-sidebar-right"\ "grid-sidebar-left grid-footer grid-sidebar-right"',);
UI & Styling
Page Title, Tags and Meta-content
center align article title, article meta content, table containers and tags
added custom page description component with styling
increased line height to compensate for increased font weight
increased margin-right specifically to increase white space for mobile displays
links are underlined
custom.scss
article p { line-height: 2.0rem; margin-right: 0.4rem; padding-left: 1rem; padding-right: 2rem; // cannot be too small or you exceed ~80 characters per line}
Inline Icons
useful for inserting SVGs into inline text
custom.scss
.inline-icon { // Sets the icon's size relative to the surrounding font size width: 0.9em; height: 0.9em; // Aligns the SVG vertically in the middle of the text line vertical-align: middle;}.search-path path,.search-path circle { //for search icon svg stroke: currentColor; stroke-width: 2; fill: none;}
Dropcaps
uses Times New Roman for dropcaps
have to specify <p class="dropcap">TEXT</p> in .md files; normal text goes into TEXT
.graph h3 { font-size: 0rem; margin: 0; &>.graph-outer { height: 100%; // original: 250px in graph.scss }}.graph-container { height: 100%; // ensure immediate parent of canvas fills outer container &>.canvas { // force the canvas to fill the parent container and override // the inline pixel values set by the library's JS. width: 100%; height: 100%; }}
changed color of header and links while keeping color transitions on hover
custom.scss
.backlinks h3 { color: var(--secondary);}.backlinks ul.overflow { margin: 0.3rem 0;}.backlinks ul li a { font-size: 0.8rem; color: var(--gray); transition: color .2s;}.backlinks ul li a:hover { color: var(--tertiary);}
Blockquotes
changed background color
padding to create slight left indent in list elements