CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Personal academic website for Andrew M. Camp (andrewmcamp.com), built with Quarto and deployed on Netlify. Fully static — no databases, no build-time JS frameworks.
Commands
Deployment is automatic: Netlify builds and deploys from the GitHub repo on push to main. Do not use quarto publish.
Architecture
Site Framework
- Quarto static site generator with
.qmd(Quarto Markdown) content files - Dual theme: Flatly (light) / Darkly (dark) via
_quarto.yml, with a dark-mode flash prevention script in the HTML header - Design tokens in
_brand.yml— colors, typography (Archivo for headings and body, JetBrains Mono code). The look follows the “Modernist” system from the Claude Design project (claude.ai/design/p/74bf3e60-…): light ground, near-black ink, one brick accent, 2px rules, zero corner radius, no shadows. Per-mode values (light/dark) are baked intheme.scssas--amc-*custom properties, including neutral (--amc-n100…n900) and accent (--amc-a100…a800) ramps - Single SCSS file at
_assets/theme/theme.scss(~1,250 lines) handles all custom styling; it compiles twice (once per theme) and uses$_is-dark: lightness($body-bg) < 50%to branch light/dark values at compile time
Pages
| Page | File | Notes |
|---|---|---|
| Landing | index.qmd |
Kicker, display headline, summary, then “Recent Research” over a lattice of featured papers (Home artboard) |
| About | about.qmd |
Masthead with square portrait, .rowgrid--about timeline, affiliations lattice, JSON-LD structured data |
| Research | writing.qmd |
Three listings (peer-reviewed / working papers / reports) beside a sticky filter rail |
| Contact | contact.qmd |
Lattice with a full-width email cell over four profile cells |
| CV | cv.qmd |
Masthead with PDF download button; each section is an h2 over a .rowgrid |
Publication System
- Each publication is a
.qmdfile inwritings/with YAML frontmatter:title,date,author,categories,tags,abstract, and optional resource links (pdf,link,slides,appendix,brief,code) categoriescontrol type grouping:peer-reviewed,working-paper,reports,featuredtagsare research topics used for filtering (e.g.,teacher-labor-market,four-day-school-week)- Publications render through the EJS template
_assets/html/pubs.ejsas.pub-itemrows: year, type tag plussubtitleas a neutral tag (unless it repeats the type label), title linked tospotlight/link/pdf, full author list with Camp bolded, a<details>abstract, and text links (Summary / PDF / Working Paper / DOI or Link / Slides / Supplemental / Brief / Code). Topictagsare not shown per item; they drive the filters - Featured items use
spotlightfield pointing to a detail page inwritings/spotlight/ - Paper detail pages (
writings/spotlight/*.qmd) are the only pages still using Quarto’s title banner (.quarto-title-banner, an ink band); they were not part of the design project
Filter System (_assets/js/filters.js)
- Vanilla JS, no dependencies. Builds a rail into
#filter-sidebaronwriting.qmdfrom the rendered items: Type from each.research-section‘sdata-type/data-label, Year and Topic from the items’data-year/data-tags(no hardcoded lists) - All three groups are multi-select toggle pills (
.tagbuttons); empty means “all”. Shows “Showing X of Y” and a Clear button when anything is active - Items and empty sections get the
hiddenattribute; the SCSS has a global[hidden] { display: none !important }because grid/flex display rules would otherwise override it - One rail only: below 992px it moves above the list (
order: -1) instead of sticking
Featured Research Grid (_assets/html/spotlight.ejs + index.qmd)
- Renders every
featuredpublication as a cell in a responsive modular grid (no JS)..spotlight-framecarries the top rule and clips; the grid is offset by one border so each cell’s own top/left hairlines draw the lattice - Cells show
.tagbadges (type:tag-accentpeer-reviewed /tag-outlineworking paper /tag-neutralreport; plussubtitleas a neutral tag unless it repeats the type label), title, a shortfindingfrom frontmatter, authors by surname with Camp bolded, and plain text links (Summary / PDF / DOI or Link) - The
findingfield should be one tight sentence; it sets the cell height
Page Mastheads
- Main pages set
title-block-banner: falseand write their own.page-masthead; thetitlefield still feeds<title>and thedescriptionfield feeds<head>..page-layout-custom #title-block-headeris hidden in SCSS title-block-banner: trueremains in_quarto.ymlfor the paper detail pages underwritings/spotlight/
Key Conventions
- CSS class prefixes: shared
.page-*,.rowgrid*,.lattice*,.tag*,.btn*; per page.landing-*,.spotlight-*,.research-*,.filter-*,.pub-*,.contact-*,.cv-*,.about-* - Design source: the Claude Design project’s artboards are the spec for layout and copy; site content (dates, journal names, reviewer list) stays the source of truth where the two disagree
- File naming: kebab-case for
.qmdfiles matching the publication title - Author formatting: comma-separated in frontmatter; Andrew M. Camp is bolded in rendered output by the EJS template
- Quarto version: pinned at 1.6.43 in
netlify.toml - Extension:
_extensions/schochastics/academiconsprovides academic social icons