PAPERS are governed academic artifacts. Each paper IS a scope. SPEC = {SCOPE}.
Every paper .md MUST declare:
| Field | Type | Required | Description |
|---|---|---|---|
| `layout` | string | YES | `paper` — renders via PAPER class (standalone, TOC, PDF download) |
| `title` | string | YES | Paper title |
| `date` | date | YES | Publication date |
| `scope` | string | YES | `PAPERS` |
| `math` | boolean | YES | `true` — enables LaTeX rendering |
| `talk` | boolean | NO | `true` — enables TALK widget |
| `footerTagline` | string | NO | Footer attribution |
| `figure` | object | NO | Hero figure (data-driven) |
| `pdf` | string | NO | Path to compiled PDF (LATEX backend) |
Every paper .md SHOULD follow this section order:
```
…
```
| Input | Output | Compiler |
|---|---|---|
| `PAPERS/*.md` (with front matter) | `PAPERS.json` index | `bin/build-surfaces` |
| `PAPERS/*.md` (with front matter) | HTML pages | Jekyll (`layout: paper`) |
| `PAPERS/*.md` (with front matter) | LaTeX backend (inherits SERVICES/LATEX) |
Papers render via layout: paper (PAPER class — standalone, extends BLOG). Two rendering modes based on pdf: front matter.
LaTeX is the source. PDF is the compiled state. The web viewer renders the compiled PDF via PDF.js with deck.js-style navigation. All three content types (paper, book, deck) are paginated — blog is the only scrolling layout.
Viewer: Full-viewport canvas. One PDF page at a time. PDF.js renders each page to
Navigation: Keyboard (←/→, Space, j/k). Touch swipe (horizontal, 50px threshold). Hash URL (#5 → page 5). Page counter (1 / 24). Prev/next buttons (hidden on mobile — use swipe).
Downloads: PDF download button (fixed position, serves raw PDF file). Books and papers get PDF. Decks get PPT + PDF.
CSS: All viewer styles use Layer 0 tokens (–bg, –scrim, –border, –accent-rgb, –z-modal, etc.). Zero hardcoded values.
MammoChat whitepaper aesthetic compiled to Jekyll with CANONIC design tokens.
Layout: Two-column body (CSS columns) on desktop, single column on mobile (<768px). Column gap: var(–space-md). Column rule: 1px solid var(–border).
Typography: Sans-serif via var(–font) (Helvetica system stack). Body: var(–font-base), line-height 1.2. No paragraph indent, var(–space-xs) paragraph spacing. Justified text with hyphens.
Full-width spans (above/across columns): Title block, abstract, h2 section headings, horizontal rules, figures, tables, code blocks.
Headings: Section headings in var(–fg-secondary) (slate), bold, var(–font-lg). Subsections in var(–font-base), bold.
Figures: All hero figures MUST be theme-reactive — use CSS custom properties (var(–fg), var(–accent), var(–glass-strong)) or JS MutationObserver on data-theme. No hardcoded RGB in SVG.
Components: Math via KaTeX. Figures via data-figure attribute (JSON config). Appendices follow body. References at end. All styling via Layer 0 tokens — zero hardcoded values in Layer 19.
| *PAPERS | SPEC | CANONIC* |