Interactive Pdf Binder

Updated 2 weeks ago

Live preview

slip-sheet

toc-entry-inactive

toc-entry-active

home-button

Components · Paper
4 variants Tokens-backed WCAG 2.2 AA target (print/PDF)

A print-first navigation system for assembled multi-document PDF binders on US Letter (612×792pt, origin bottom-left). One component, three navigation surfaces — a slip-sheet table-of-contents cover, TOC entries (active and inactive), and a HOME return button stamped on every content page — that together turn a stack of concatenated source PDFs into a document a reader can move through inside any PDF viewer.

Rendered from components/interactive-pdf-binder/recipe.json

What it is

Interactive PDF Binder Navigation is not a DOM component. It is the design-system record for the navigation layer that tool-pdf-interactive.py (reportlab + pypdf) stamps onto an assembled binder of source PDFs. The recipe's html/css describe only the design-system preview surface; the shipped artifact is a static PDF whose interactivity lives entirely in PDF link annotations and the document outline.

Every value on this page — geometry, colour, type — is drawn from the canonical Python constants in the generator, extracted directly rather than from prose, and consolidated into the Paper pillar as the paper.*.pdf-nav / pdf-binder token groups. See the Paper tokens tier for the leaf values.

This is the only member of the Paper document family that is genuinely interactive within its viewer. The other five families are static CSS-print layouts: legal subscription agreement, legal prospectus, legal agency suite, financial report layout, and financial statement (year-end).

When to use

  • Assembling several source PDFs into one deliverable — a binder of agreements, schedules, or statements that a reader must navigate between. The slip-sheet TOC gives each source document a cover and a jump target.
  • A binder that will be read on screen, in a PDF viewer. The GoTo links and document outline are the point; a binder intended only for print does not need this layer.
  • When the reader needs to return to the index repeatedly. The HOME button on every content page is the return path.

When not to use

  • Do not use it for a single, authored document. If there is nothing to bind, there is no TOC to generate — reach for the relevant CSS-print family instead.
  • Do not use it to restyle the source PDFs. The generator overlays navigation; it does not reflow, re-tag, or re-typeset the documents it binds.
  • Do not treat the point-space geometry as CSS @page geometry. This component is rendered in PDF point coordinates with a bottom-left origin — it deliberately keeps its own paper.primitive.pdf-nav.* group rather than sharing the CSS-print page primitives.

The three navigation surfaces

The binder navigation is composed of three surfaces. Two of them (the TOC entry) have an active and an inactive form, giving four variants in total.

1 · Slip-sheet TOC cover

A generated cover page inserted before each source document. It carries a header title, an organisation subtitle, a 1.5pt rule, an optional right-aligned draft/version label (first sheet only), and an italic footer instruction. A single slip sheet holds up to 8 TOC entries; that ceiling is currently a hard limit in the generator (see Open questions).

2 · TOC entry

One navigable row per bound document, in two states:

  • Inactive — a navy number and title for a document other than the current one, with an invisible full-rect GoTo link to that document's slip sheet.
  • Active — the row for the current document: a grey-light highlight rectangle, black text, and a leading arrow indicator. It carries no link, because it points at itself.

3 · HOME return button

A 64×20pt navy rounded rectangle (4pt corner radius) with a white HOME label, placed lower-right. It is stamped on every content page — never on a slip sheet — and carries a transparent GoTo link back to page 0, top.

Variants

VariantSurfaceDescription
slip-sheetTOC coverGenerated cover preceding each source document: header title, org subtitle, 1.5pt rule, optional right-aligned draft label (first sheet only), italic footer instruction. Holds up to 8 TOC entries per sheet.
toc-entry-inactiveTOC entryNavigable row for a non-current document: navy number + title, invisible full-rect GoTo link to that document's slip sheet.
toc-entry-activeTOC entryRow for the current document: grey-light highlight rect, black text, leading arrow indicator; no link (self).
home-buttonReturn button64×20pt navy rounded-rect (4pt radius) with white HOME label, lower-right placement. Stamped on every content page (never slip sheets); transparent GoTo link to page 0 top.

Coordinate space and geometry

The binder is generated in PDF point-space on US Letter, 612×792pt, origin bottom-left — not a CSS @page box model. All geometry comes from paper.primitive.pdf-nav.*:

PrimitiveTokenValue
Page width{paper.primitive.pdf-nav.page-width}612pt
Page height{paper.primitive.pdf-nav.page-height}792pt
Content zonemargin-left / margin-right72pt–540pt
First TOC entry baselinetoc-entry-first-y565pt
TOC entry step (centre-to-centre){paper.primitive.pdf-nav.toc-entry-step}65pt
TOC entry heighttoc-entry-height46pt
TOC entry widthtoc-entry-width530pt
HOME button width{paper.primitive.pdf-nav.home-width}64pt
HOME button height{paper.primitive.pdf-nav.home-height}20pt
HOME corner radius{paper.primitive.pdf-nav.home-corner-radius}4pt
Slip-sheet rule strokerule-stroke1.5pt

The 1.5pt slip-sheet rule is the emphasis step of the shared Paper rule-weight ladder — the same 1.5pt used for cover rules and summary-page borders elsewhere in the pillar.

Colour and type tokens

Colour resolves through paper.semantic.pdf-binder.* to the paper.primitive.color tier:

Semantic tokenResolves toValueRole
pdf-binder.toc-entry-inactivepdf-nav-navy#002e63Inactive TOC number + title
pdf-binder.toc-entry-activeinkblackActive-entry text
pdf-binder.toc-entry-highlightpdf-nav-grey-light#f5f5f5Active-entry highlight fill
pdf-binder.home-button-fillpdf-nav-navy#002e63HOME button rectangle
pdf-binder.home-button-labelpdf-nav-on-navy#ffffffHOME label
pdf-binder.header-inkinkblackSlip-sheet header title
pdf-binder.supporting-inkpdf-nav-grey-dark#4d4d4dSubtitle + italic footer instruction
pdf-binder.version-label-inkpdf-nav-grey-label#737373Draft / version label

Type is set in the PDF core-14 Helvetica stack (Helvetica, Arial) — no font embedding required:

TokenSize / weightApplied to
pdf-binder.binder-title-type16pt boldSlip-sheet header title
pdf-binder.home-label-type8pt boldHOME label
pdf-nav.subtitle10pt regularOrg subtitle
pdf-nav.toc-entry11pt boldTOC rows
pdf-nav.footer9pt regular, rendered italic (Helvetica-Oblique)Footer instruction
pdf-nav.draft-label9pt regularDraft / version label

Accessibility

This produces a static PDF page, so web-UI accessibility mechanisms — focus rings, ARIA roles, keyboard tab order — do not apply. What applies is PDF-native accessibility, and it is partial by design:

  • Navigation is /GoTo link annotations plus a PDF document outline (/PageMode /UseOutlines), with /DisplayDocTitle true so viewers announce the document title rather than the filename.
  • Contrast is strong. Navy #002e63 on white measures ~13:1, and white on navy ~13:1 — both AAA. This is the print/PDF contrast target the recipe declares against WCAG 2.2 AA.
  • Tagged-PDF reading order is not handled. Source PDFs pass through untagged — the generator does not add Tagged-PDF structure, so reading-order conformance for assistive technology depends entirely on the tagging of the source documents. This is a known, open accessibility gap, not a solved property (see Open questions oq-3). Do not claim screen-reader conformance for a binder whose sources are untagged.

The artifact is static: no motion, no transitions.

Open questions

Carried verbatim from the recipe so downstream consumers do not treat unresolved items as settled:

  • oq-1 — phantom colour. An earlier draft listed a 7th colour GREY_MID (#666680, "inactive entry subtitles") that does not exist in the canonical Python source (no subtitle rows are generated). It is dropped from this recipe; confirm no production instance relies on it before treating this as fully closed.
  • oq-2 — 8-entry ceiling. The max-8-TOC-entries-per-slip-sheet limit is currently hard-coded. Whether it should become a token, and how binders with more than 8 documents should paginate across multiple slip sheets, is undecided.
  • oq-3 — Tagged-PDF conformance. Reading-order conformance for assistive technology is unhandled; source PDFs pass through untagged.
  • oq-4 — navy hex rounding. The RGB constant (0, 0.18, 0.39) computes to ~#002f63; the design draft and this recipe both state #002e63. The value must be pinned definitively against the live Python source constant.
Important Information

Design System disclosure

This site provides open-source design tokens, documentation, and self-hostable software published by Woodfine Capital Projects Inc. Information here is for general reference only and does not constitute an offer, warranty, or a guarantee of fitness for any particular purpose. Statements regarding planned, intended, or targeted future features are forward-looking and subject to change without notice; they are not undertaken to be updated except as required by law.