Skip to content

feat(public-profile): set the résumé as a designed document in both renderers - #274

Merged
willgriffin merged 3 commits into
mainfrom
claude/resume-design-refactor-85619c
Oct 29, 2026
Merged

willgriffin merged 3 commits into
mainfrom
claude/resume-design-refactor-85619c

Conversation

@willgriffin

Copy link
Copy Markdown
Owner

Closes #233. Stacked on #273 (project bullets); GitHub retargets this PR to main when #273 merges and its branch is deleted. Not to be merged from the authoring session.

What changes

Will's design review of the deployed six-page PDF, applied to both the standalone document (public-profile-render.ts, which feeds the PDF) and the Svelte page (PublicProfileResume.svelte):

  • Pagination. Only a heading with its date line and summary is kept together (.keep); bullet lists flow across pages; headings carry break-after: avoid; each bullet stays whole; a project item may paginate but its first sub-bullet stays with the project line. Page one is full instead of two-thirds blank.
  • Fonts. Latin subsets of Source Serif 4 (400–600 + italic) and Inter Tight (500–600), the same Google Fonts builds app.html loads, are embedded as base64 @font-face in the standalone document, so the headless Chromium in the production image (fonts-liberation only) never falls back to Courier. Generated module public-profile-fonts.ts + OFL notice + regeneration script scripts/vendor-public-profile-fonts.ts. No monospace face anywhere.
  • Scale. 10.5pt / 1.35 body, Letter with 18mm margins (also passed to renderHtmlToPdf), no gap between a heading and its date.
  • Dates. formatPublicProfileDateRange renders Dec 2024 – Present / Sep 2003 – 2008 from the snapshot's YYYY-MM / YYYY strings, right-aligned on the heading line.
  • Education. Institution bold, credential after it, date inline, detail beneath.
  • Skills moved to just after the profile summary, compact.
  • Running header (name, left) on pages after the first via a repeated table header; the page-one masthead covers the first instance.
  • Projects. Indented list with a left rule: name bold, summary on the same line, project bullets (feat(public-profile): carry project achievements into the public snapshot #273) as a smaller sub-list.
  • Palette and light/dark behaviour from fix(profiles): give the public résumé page its own light and dark palette #272 unchanged; print pins light; both renderers share section order and hierarchy.

Known limit: Chromium has no @page margin boxes or counter(page), and @happyvertical/pdf does not pass Puppeteer header/footer templates, so there is no page number yet. Follow-up belongs upstream in @happyvertical/pdf (header/footer template passthrough).

Verification

Synthetic six-position fixture rendered through renderPublicProfilePdf with local Chrome: 6 pages → 3 pages; pdffonts lists only embedded SourceSerif4 and InterTight subsets; pdftotext -bbox shows no orphaned glyph at any page foot (two Chromium print quirks found and worked around: duplicated outside list markers, and the next page's repeated header leaking its ascender ink onto the previous page).

Spec extended for date formatting, heading-line dates, education order, keep wrapper, project list, section order, running header, embedded faces, margins, break rules.

pnpm format-check, pnpm lint, site check (svelte-check 0 errors), site build, pnpm knowledge:check, and the public-profile specs (60 tests) pass. The Svelte page was compiled and type-checked but not opened in a browser in this session.

Review cycle iolaus-233-resume-design, standard risk, codex-sol (gpt-6.1-sol, balanced): round 1 one accepted P2 (project items could not paginate), fixed in the second commit; round 2 recall CLEAN.

…enderers

Pagination keeps a heading with its date line and summary and lets bullet
lists flow, so page one is no longer two-thirds blank. The standalone
document embeds latin subsets of Source Serif 4 and Inter Tight (OFL) as
base64 font faces, so the headless Chromium in the production image never
falls back to Courier. Type scale drops to 10.5pt/1.35 with 18mm margins;
dates render as 'Dec 2024 – Present' on the heading line; education leads
with the institution; skills sit after the summary; projects are a compact
indented list with their bullets as a sub-list; a running header repeats the
name on pages after the first. The Svelte page mirrors the same order and
hierarchy with the palette from #272 unchanged.

Closes #233
…rst bullet

Review finding: the item-level break-inside rule also kept a project and
its whole sub-list together, which could push a long project to the next
page and leave blank space. Project items may now break; the sub-list
avoids starting on a new page so the project line never ends a page alone.
…et covers

The white bullet (U+25E6) is outside the embedded latin subsets, so
Chromium pulled a fallback serif for that one glyph.
@willgriffin

Copy link
Copy Markdown
Owner Author

Pushed 10a8f2f: the project sub-bullet marker is now an en dash, which the embedded latin subsets cover; U+25E6 had pulled a fallback serif for that one glyph (seen when rendering a real snapshot). Validation re-run at 10a8f2f (specs, format-check, lint, check, build, knowledge:check all green); review-cycle round 3 recall on codex-sol: CLEAN.

@willgriffin
willgriffin changed the base branch from claude/project-bullets-snapshot-696186 to main October 29, 2026 18:49
@willgriffin
willgriffin merged commit 326864a into main Oct 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(resume): improve public PDF pagination for long experience sections

1 participant