This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
React-PDF is a library for creating PDF documents using React components. It's a monorepo using Lerna with independent versioning, Yarn 1.22.19 as the package manager, and all packages are ESM ("type": "module").
yarn install # Install dependencies and bootstrap monorepo
yarn build # Build all packages (lerna run build)
yarn watch # Watch mode - rebuilds on changes (for development)
yarn test # Run all tests (vitest)
yarn test packages/layout # Run tests for a specific package
yarn lint # Lint all packages (eslint packages)
yarn typecheck # TypeScript type checking across all packages
yarn dev # Run example appsTo run a single test file: yarn vitest run path/to/test.ts
The library works as a pipeline: React components β reconciler β layout β render β PDF output.
@react-pdf/renderer (main entry point - exports Document, Page, View, Text, etc.)
βββ @react-pdf/reconciler β React fiber reconciler that creates the internal element tree
βββ @react-pdf/layout β Resolves layout using Yoga (flexbox), handles pagination
β βββ @react-pdf/textkit β Text measurement, line breaking, hyphenation
β βββ @react-pdf/stylesheet β CSS-like style parsing and resolution
β βββ @react-pdf/image β PNG/JPEG image fetching and parsing
β βββ @react-pdf/font β Font loading, registration, emoji support
βββ @react-pdf/render β Renders resolved layout tree to PDF drawing operations
β βββ @react-pdf/pdfkit β Low-level PDF generation (fork of pdfkit)
βββ @react-pdf/primitives β Shared component type constants
Utility packages: @react-pdf/fns (helpers), @react-pdf/types (TypeScript types), @react-pdf/math (math utils), @react-pdf/png-js (PNG decoder), @react-pdf/svgkit (SVG support).
Each package uses Rollup for bundling. The renderer package produces multiple builds: server, browser, and minified variants. TypeScript is used throughout with strict mode.
- Framework: Vitest with workspace configuration (
vitest.workspace.js) - Tested packages: fns, font, image, render, layout, svgkit, textkit, renderer, stylesheet, primitives
- Renderer has two test configs: main (fork pool) and browser (jsdom environment)
- Snapshot testing:
jest-image-snapshotfor visual regression tests - Multi-React support: Tests can run against React 16, 17, 18, and 19 via environment variables
When making changes, always include tests. Add tests in the same location where tests already exist for the package being modified (e.g. packages/layout/tests/, packages/renderer/tests/).
- ESLint 9 with TypeScript parser, Prettier (single quotes), enforced via Husky pre-commit hooks
- Packages
pdfkit,png-js,yoga, andexamplesare excluded from linting
To visually inspect generated PDFs during debugging, convert pages to images:
Using pdftoppm (preferred, often pre-installed via poppler-utils):
pdftoppm -png -r 200 document.pdf previewThis generates preview-1.png, preview-2.png, etc. at 200 DPI.
Fallback: PyMuPDF (if pdftoppm is unavailable):
pip install pymupdfimport fitz
doc = fitz.open("document.pdf")
for i, page in enumerate(doc):
pix = page.get_pixmap(dpi=200)
pix.save(f"page-{i+1}.png")Uses Changesets for versioning:
yarn changeset # Create a changeset
yarn version-packages # Apply changesets to bump versions
yarn release # Publish to npm